|
|
|
@ -17,8 +17,8 @@ import cokr.xit.foundation.AbstractComponent;
|
|
|
|
|
/**Http 통신 유틸리티
|
|
|
|
|
* <p>다음은 사용례이다.
|
|
|
|
|
* <pre><code> new Http().get(
|
|
|
|
|
* "https://...",
|
|
|
|
|
* new Http.Conf()
|
|
|
|
|
* .url("https://...")
|
|
|
|
|
* // .header("Content-Type", "application/x-www-form-urlencoded")
|
|
|
|
|
* .param("param0", "value0")
|
|
|
|
|
* .param("param1", "value1")
|
|
|
|
@ -27,6 +27,8 @@ import cokr.xit.foundation.AbstractComponent;
|
|
|
|
|
* @author mjkhan
|
|
|
|
|
*/
|
|
|
|
|
public class Http extends AbstractComponent {
|
|
|
|
|
public static final String FORM = "application/x-www-form-urlencoded";
|
|
|
|
|
public static final String JSON = "application/json";
|
|
|
|
|
/**http 통신 시 설정하는 옵션
|
|
|
|
|
* @author mjkhan
|
|
|
|
|
*/
|
|
|
|
@ -43,12 +45,12 @@ public class Http extends AbstractComponent {
|
|
|
|
|
/**파라미터 인코딩에 사용하는 문자셋의 이름을 반환한다.
|
|
|
|
|
* @return 파라미터 인코딩에 사용하는 문자셋의 이름
|
|
|
|
|
*/
|
|
|
|
|
protected String charset() {
|
|
|
|
|
private String charset() {
|
|
|
|
|
return ifEmpty(charset, () -> "UTF-8");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**파라미터 인코딩에 사용하는 문자셋의 이름을 설정한다.
|
|
|
|
|
* @param charset 파라미터 인코딩에 사용하는 문자셋의 이름
|
|
|
|
|
* @param charset 파라미터 인코딩에 사용하는 문자셋의 이름. 디폴트는 UTF-8.
|
|
|
|
|
* @return 현재 Conf
|
|
|
|
|
*/
|
|
|
|
|
public Conf charset(String charset) {
|
|
|
|
@ -60,21 +62,30 @@ public class Http extends AbstractComponent {
|
|
|
|
|
* @return URL
|
|
|
|
|
* @throws Exception
|
|
|
|
|
*/
|
|
|
|
|
protected URL url() throws Exception {
|
|
|
|
|
return new URL(url);
|
|
|
|
|
private URL url() throws Exception {
|
|
|
|
|
return new URL(notEmpty(url, "url"));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**http 연결 방법을 반환한다. 디폴트는 "GET"
|
|
|
|
|
* @return http 연결 방법
|
|
|
|
|
/**http로 접속할 url을 설정한다.
|
|
|
|
|
* @param url url
|
|
|
|
|
* @return Conf
|
|
|
|
|
*/
|
|
|
|
|
public Conf url(String url) {
|
|
|
|
|
this.url = url;
|
|
|
|
|
return this;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**http 연결 방법을 반환한다.
|
|
|
|
|
* @return http 연결 방법. 디폴트는 "GET"
|
|
|
|
|
*/
|
|
|
|
|
protected String method() {
|
|
|
|
|
private String method() {
|
|
|
|
|
return ifEmpty(method, "GET");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**설정한 파라미터 이름과 값들을 인코딩하여 반환한다.
|
|
|
|
|
* @return 인코딩한 파라미터 이름과 값
|
|
|
|
|
*/
|
|
|
|
|
protected String params() {
|
|
|
|
|
private String params() {
|
|
|
|
|
return !isEmpty(params) ? params.entrySet().stream().map(this::encode).collect(Collectors.joining("&")) : "";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -82,7 +93,7 @@ public class Http extends AbstractComponent {
|
|
|
|
|
* @param entry 맵 엔트리
|
|
|
|
|
* @return 인코딩한 맵 엔트리
|
|
|
|
|
*/
|
|
|
|
|
protected String encode(Map.Entry<String, String> entry) {
|
|
|
|
|
private String encode(Map.Entry<String, String> entry) {
|
|
|
|
|
try {
|
|
|
|
|
return URLEncoder.encode(entry.getKey(), charset()) + "=" + URLEncoder.encode(entry.getValue(), charset());
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
@ -117,7 +128,7 @@ public class Http extends AbstractComponent {
|
|
|
|
|
/**설정한 헤더들을 http에 설정한다.
|
|
|
|
|
* @param http HttpURLConnection
|
|
|
|
|
*/
|
|
|
|
|
protected void setHeaders(HttpURLConnection http) {
|
|
|
|
|
private void setHeaders(HttpURLConnection http) {
|
|
|
|
|
if (isEmpty(headers)) return;
|
|
|
|
|
|
|
|
|
|
headers.forEach(http::setRequestProperty);
|
|
|
|
@ -126,7 +137,7 @@ public class Http extends AbstractComponent {
|
|
|
|
|
/**http 접속 시 타임아웃을 반환한다. 디폴트는 10000
|
|
|
|
|
* @return http 접속 시 타임아웃
|
|
|
|
|
*/
|
|
|
|
|
protected int timeout() {
|
|
|
|
|
private int timeout() {
|
|
|
|
|
return Math.max(timeout, 10000);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -187,35 +198,32 @@ public class Http extends AbstractComponent {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**지정한 url로 GET 요청을 한다.
|
|
|
|
|
* @param url url
|
|
|
|
|
* @param conf 요청 시 설정할 옵션
|
|
|
|
|
*/
|
|
|
|
|
public void get(String url, Conf conf) {
|
|
|
|
|
public void get(Conf conf) {
|
|
|
|
|
if (conf == null)
|
|
|
|
|
conf = new Conf();
|
|
|
|
|
conf.method = "GET";
|
|
|
|
|
request(url, conf);
|
|
|
|
|
request(conf);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**지정한 url로 POST 요청을 한다.
|
|
|
|
|
* @param url url
|
|
|
|
|
* @param conf 요청 시 설정할 옵션
|
|
|
|
|
*/
|
|
|
|
|
public void post(String url, Conf conf) {
|
|
|
|
|
public void post(Conf conf) {
|
|
|
|
|
if (conf == null)
|
|
|
|
|
conf = new Conf();
|
|
|
|
|
conf.method = "POST";
|
|
|
|
|
request(url, conf);
|
|
|
|
|
request(conf);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**지정한 url로 요청을 보내고, 이 때 conf를 옵션으로 설정한다.
|
|
|
|
|
* @param url url
|
|
|
|
|
* @param conf 요청 시 설정할 옵션
|
|
|
|
|
*/
|
|
|
|
|
protected void request(String url, Conf conf) {
|
|
|
|
|
private void request(Conf conf) {
|
|
|
|
|
HttpURLConnection http = null;
|
|
|
|
|
try {
|
|
|
|
|
conf.url = url;
|
|
|
|
|
http = (HttpURLConnection)conf.url().openConnection();
|
|
|
|
|
http.setRequestMethod(conf.method());
|
|
|
|
|
http.setUseCaches(false);
|
|
|
|
@ -243,23 +251,23 @@ public class Http extends AbstractComponent {
|
|
|
|
|
* @param http HttpURLConnection
|
|
|
|
|
* @throws Exception
|
|
|
|
|
*/
|
|
|
|
|
protected void setParams(Conf conf, HttpURLConnection http) throws Exception {
|
|
|
|
|
private void setParams(Conf conf, HttpURLConnection http) throws Exception {
|
|
|
|
|
String params = conf.params();
|
|
|
|
|
if (!isEmpty(params)) {
|
|
|
|
|
if (isEmpty(params)) return;
|
|
|
|
|
|
|
|
|
|
http.setDoOutput(true);
|
|
|
|
|
DataOutputStream out = new DataOutputStream(http.getOutputStream());
|
|
|
|
|
out.writeBytes(params);
|
|
|
|
|
out.flush();
|
|
|
|
|
out.close();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**http 요청의 응답을 추출한다.
|
|
|
|
|
* @param http HttpURLConnection
|
|
|
|
|
* @return http 요청의 응답
|
|
|
|
|
* @throws Exception
|
|
|
|
|
*/
|
|
|
|
|
protected Response getResponse(HttpURLConnection http) throws Exception {
|
|
|
|
|
private Response getResponse(HttpURLConnection http) throws Exception {
|
|
|
|
|
Response resp = new Response();
|
|
|
|
|
resp.status = http.getResponseCode();
|
|
|
|
|
|
|
|
|
@ -284,7 +292,7 @@ public class Http extends AbstractComponent {
|
|
|
|
|
* @param t Throwable
|
|
|
|
|
* @return http 요청 중 오류가 발생했을 때 응답
|
|
|
|
|
*/
|
|
|
|
|
protected Response getResponse(Throwable t) {
|
|
|
|
|
private Response getResponse(Throwable t) {
|
|
|
|
|
Response resp = new Response();
|
|
|
|
|
resp.status = 500;
|
|
|
|
|
resp.response = rootCause(t).getMessage();
|
|
|
|
|