|
|
@ -26,6 +26,8 @@ import java.util.Random;
|
|
|
|
import java.util.concurrent.CompletableFuture;
|
|
|
|
import java.util.concurrent.CompletableFuture;
|
|
|
|
import java.util.function.Consumer;
|
|
|
|
import java.util.function.Consumer;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import javax.net.ssl.SSLContext;
|
|
|
|
|
|
|
|
|
|
|
|
import cokr.xit.foundation.Assert;
|
|
|
|
import cokr.xit.foundation.Assert;
|
|
|
|
import cokr.xit.foundation.data.JSON;
|
|
|
|
import cokr.xit.foundation.data.JSON;
|
|
|
|
|
|
|
|
|
|
|
@ -83,6 +85,7 @@ public class WebClient {
|
|
|
|
private HttpClient.Version version = HttpClient.Version.HTTP_2;
|
|
|
|
private HttpClient.Version version = HttpClient.Version.HTTP_2;
|
|
|
|
private Duration timeout = Duration.ofSeconds(30);
|
|
|
|
private Duration timeout = Duration.ofSeconds(30);
|
|
|
|
private Authenticator authenticator;
|
|
|
|
private Authenticator authenticator;
|
|
|
|
|
|
|
|
private SSLContext sslContext;
|
|
|
|
private ProxySelector proxy;
|
|
|
|
private ProxySelector proxy;
|
|
|
|
|
|
|
|
|
|
|
|
private HttpClient.Redirect followRedirects = HttpClient.Redirect.NORMAL;
|
|
|
|
private HttpClient.Redirect followRedirects = HttpClient.Redirect.NORMAL;
|
|
|
@ -114,6 +117,15 @@ public class WebClient {
|
|
|
|
return this;
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**SSL 통신을 할 경우 SSLContext를 설정한다.
|
|
|
|
|
|
|
|
* @param sslContext SSLContext
|
|
|
|
|
|
|
|
* @return 현재 WebClient
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
public WebClient sslContext(SSLContext sslContext) {
|
|
|
|
|
|
|
|
this.sslContext = sslContext;
|
|
|
|
|
|
|
|
return this;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**서버와 접속 시 프록시를 사용할 경우 proxy를 설정한다.
|
|
|
|
/**서버와 접속 시 프록시를 사용할 경우 proxy를 설정한다.
|
|
|
|
* @param proxy 서버 접속에 사용할 프록시 설정
|
|
|
|
* @param proxy 서버 접속에 사용할 프록시 설정
|
|
|
|
* @return 현재 WebClient
|
|
|
|
* @return 현재 WebClient
|
|
|
@ -140,6 +152,8 @@ public class WebClient {
|
|
|
|
|
|
|
|
|
|
|
|
if (authenticator != null)
|
|
|
|
if (authenticator != null)
|
|
|
|
builder.authenticator(authenticator);
|
|
|
|
builder.authenticator(authenticator);
|
|
|
|
|
|
|
|
if (sslContext != null)
|
|
|
|
|
|
|
|
builder.sslContext(sslContext);
|
|
|
|
if (proxy != null)
|
|
|
|
if (proxy != null)
|
|
|
|
builder.proxy(proxy);
|
|
|
|
builder.proxy(proxy);
|
|
|
|
|
|
|
|
|
|
|
@ -241,6 +255,9 @@ public class WebClient {
|
|
|
|
* @author mjkhan
|
|
|
|
* @author mjkhan
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
public static class Request {
|
|
|
|
public static class Request {
|
|
|
|
|
|
|
|
/** 요청 성공 */
|
|
|
|
|
|
|
|
public static final int SUCCESS = 200;
|
|
|
|
|
|
|
|
|
|
|
|
public static enum ContentType {
|
|
|
|
public static enum ContentType {
|
|
|
|
FORM("application/x-www-form-urlencoded"),
|
|
|
|
FORM("application/x-www-form-urlencoded"),
|
|
|
|
JSON("application/json"),
|
|
|
|
JSON("application/json"),
|
|
|
@ -272,6 +289,8 @@ public class WebClient {
|
|
|
|
private Charset charset = StandardCharsets.UTF_8;
|
|
|
|
private Charset charset = StandardCharsets.UTF_8;
|
|
|
|
private LinkedHashMap<String, String> headers;
|
|
|
|
private LinkedHashMap<String, String> headers;
|
|
|
|
private LinkedHashMap<String, Object> keyValues;
|
|
|
|
private LinkedHashMap<String, Object> keyValues;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private JSON json;
|
|
|
|
private Consumer<HttpResponse<String>> textHandler = hresp -> {
|
|
|
|
private Consumer<HttpResponse<String>> textHandler = hresp -> {
|
|
|
|
HttpHeaders headers = hresp.headers();
|
|
|
|
HttpHeaders headers = hresp.headers();
|
|
|
|
headers.map().forEach((k, v) -> System.out.println(k + " = " + v));
|
|
|
|
headers.map().forEach((k, v) -> System.out.println(k + " = " + v));
|
|
|
@ -340,17 +359,18 @@ public class WebClient {
|
|
|
|
return this;
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**데이터를 JSON으로 주고받는지 설정한다. 디폴트는 false.
|
|
|
|
/**데이터를 JSON으로 변환할 JSON을 설정한다.
|
|
|
|
* @param json 데이터의 JSON 여부
|
|
|
|
* @param json JSON
|
|
|
|
* <ul><li>데이터를 JSON으로 주고받으면 true</li>
|
|
|
|
|
|
|
|
* <li>그렇지 않으면 false</li>
|
|
|
|
|
|
|
|
* </ul>
|
|
|
|
|
|
|
|
* @return 현재 Request
|
|
|
|
* @return 현재 Request
|
|
|
|
public Request json(boolean json) {
|
|
|
|
*/
|
|
|
|
|
|
|
|
public Request json(JSON json) {
|
|
|
|
this.json = json;
|
|
|
|
this.json = json;
|
|
|
|
return this;
|
|
|
|
return contentType(ContentType.JSON);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private JSON json() {
|
|
|
|
|
|
|
|
return Assert.ifEmpty(json, () -> json = new JSON());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**요청의 응답이 파일인지 설정한다. 디폴트는 false(텍스트).
|
|
|
|
/**요청의 응답이 파일인지 설정한다. 디폴트는 false(텍스트).
|
|
|
|
* @param download
|
|
|
|
* @param download
|
|
|
@ -365,7 +385,8 @@ public class WebClient {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private Object bodyData() {
|
|
|
|
private Object bodyData() {
|
|
|
|
if (Assert.isEmpty(keyValues)) return null;
|
|
|
|
int size = keyValues != null ? keyValues.size() : 0;
|
|
|
|
|
|
|
|
if (size != 1) return null;
|
|
|
|
|
|
|
|
|
|
|
|
Object value = keyValues.remove("body");
|
|
|
|
Object value = keyValues.remove("body");
|
|
|
|
if (value != null)
|
|
|
|
if (value != null)
|
|
|
@ -448,10 +469,10 @@ public class WebClient {
|
|
|
|
private String inJSON() {
|
|
|
|
private String inJSON() {
|
|
|
|
Object body = bodyData();
|
|
|
|
Object body = bodyData();
|
|
|
|
if (!Assert.isEmpty(body))
|
|
|
|
if (!Assert.isEmpty(body))
|
|
|
|
return new JSON().stringify(body);
|
|
|
|
return json().stringify(body);
|
|
|
|
|
|
|
|
|
|
|
|
if (!Assert.isEmpty(keyValues))
|
|
|
|
if (!Assert.isEmpty(keyValues))
|
|
|
|
return new JSON().stringify(keyValues);
|
|
|
|
return json().stringify(keyValues);
|
|
|
|
|
|
|
|
|
|
|
|
return "";
|
|
|
|
return "";
|
|
|
|
}
|
|
|
|
}
|
|
|
|