WebClient는 http(s) 요청을 전송하고 응답을 수신하는 것을 지원한다.
http 요청의 전송은
- WebClient의
get(WebClient.Request)
, 또는post(WebClient.Request)
메소드로 한다. - 요청을 보낼 url은
WebClient.Request.uri(String)
로 설정한다. - 요청의 컨텐트 유형은
WebClient.Request.contentType(WebClient.Request.ContentType)
로 설정한다. - 요청의 파라미터는
WebClient.Request.data(...)
, 또는WebClient.Request.bodyData(...)
로 설정한다. - 요청의 응답은 디폴트로 동기식으로 수신하며 get(...), 또는 post(...) 메소드의 결과값으로 받는다.
- 요청을 비동기식으로 처리하려면
WebClient.Request.async(true)
를 호출한다.- 응답은 WebClient.Request.onResponse(Consumer)로 핸들러를 설정해서 처리한다.
- 다운로드 요청은
WebClient.Request.download(true)
를 호출한다.- 비동기 응답은
WebClient.Request.onDownload(Consumer)
로 핸들러를 설정해서 처리한다.
FORM 데이터 요청/응답
GET
다음은 GET 방식 http 요청/응답을 동기식으로 통신하는 예다.
WebClient webClient = new WebClient();
HttpResponse<String> hresp = webClient.get(req -> req.uri("http://host?param-name0=param-value0¶m-name1=param-value1")); // url, 파라미터 설정
String resp = hresp.body();
위 예에서 파라미터는 다음과 같이 설정할 수 있다.
WebClient webClient = new WebClient();
HttpResponse<String> hresp = webClient.get(req ->
req.uri("http://host") // url 설정
.data("param-name0", "param-value0") // 파라미터 설정
.data("param-name1", "param-value1")
);
String resp = hresp.body();
위 예는 다음과 같이 간단히 할 수 있다.
HttpResponse<String> hresp = new WebClient().get(req ->
req.uri("http://host") // url 설정
.data("param-name0", "param-value0") // 파라미터 설정
.data("param-name1", "param-value1")
);
String resp = hresp.body();
POST
다음은 POST 방식 http 요청/응답을 동기식으로 통신하는 예다.
WebClient webClient = new WebClient();
HttpResponse<String> hresp = webClient.post(req ->
req.uri("http://host") // url 설정
.contentType(WebClient.Request.ContentType.FORM) // content type 설정
.data("param-name0", "param-value0") // 파라미터 설정
.data("param-name1", "param-value1")
);
String resp = hresp.body();
위 예는 다음과 같이 간단히 할 수 있다.
HttpResponse<String> hresp = new WebClient().post(req ->
req.uri("http://host") // url 설정
.contentType(WebClient.Request.ContentType.FORM) // content type 설정
.data("param-name0", "param-value0") // 파라미터 설정
.data("param-name1", "param-value1")
);
String resp = hresp.body();
비동기 처리
form 데이터를 비동기식으로 처리하려면 WebClient.Request에
async(true)
로 비동기 여부를 설정하고onResponse(Consumer)
로 응답 핸들러를 설정하여
처리한다. 다음은 사용방법을 보여주는 예다.
new WebClient().post(req ->
req.uri("http://host") // url 설정
.contentType(WebClient.Request.ContentType.FORM) // content type 설정
.data("param-name0", "param-value0") // 파라미터 설정
.data("param-name1", "param-value1")
.async(true) // 비동기 설정
.onResponse(hresp -> System.out.println(hresp.body())) // 응답 핸들러 설정
);
JSON 데이터 요청/응답
JSON 요청/응답을 처리하려면
WebClient.contentType(...)
에WebClient.Request.ContentType.JSON
을 설정하거나- 'WebClient.json(...)'에 재사용하려는 JSON 객체를 설정한다.
- 요청 데이터는 'WebClient.bodyData(...)'에 전달한다.
동기 처리
다음은 JSON 요청/응답을 동기식으로 통신하는 예다.
MyObject myObj = ...; // 사용자 정의 객체
...
HttpResponse<String> hresp = new WebClient().post(req -> // 또는 WebClient.get(...)
req.uri("http://host") // url 설정
.contentType(WebClient.Request.ContentType.JSON) // content type 설정
.bodyData(myObj) // 사용자 정의 객체를 요청 파라미터로 설정
);
String resp = hresp.body();
이미 선언된 JSON 객체를 재사용하려면 다음과 같이 할 수 있다.
JSON json = new JSON();
...
HttpResponse<String> hresp = new WebClient().post(req ->
req.uri("http://host") // url 설정
.json(json) // json 설정, content type 설정
.bodyData(myObj) // 사용자 정의 객체를 요청 파라미터로 설정
);
String resp = hresp.body();
비동기 처리
JSON 데이터를 비동기식으로 처리하려면 WebClient.Request에
async(true)
로 비동기 여부를 설정하고onResponse(Consumer)
로 응답 핸들러를 설정하여
처리한다. 다음은 사용방법을 보여주는 예다.
new WebClient().post(req -> // 또는 WebClient.get(...)
req.uri("http://host") // url 설정
.contentType(WebClient.Request.ContentType.JSON) // content type 설정
.bodyData(myObj) // 사용자 정의 객체를 요청 파라미터로 설정
.async(true) // 비동기 설정
.onResponse(hresp -> System.out.println(hresp.body())) // 응답 핸들러 설정
);
XML 데이터 요청/응답
XML 요청/응답을 처리하려면
WebClient.contentType(...)
에WebClient.Request.ContentType.XML
을 설정한다.- 요청 데이터는 'WebClient.bodyData(...)'에 전달한다.
동기 처리
다음은 XML 요청/응답을 동기식으로 통신하는 예다.
String xml = ...; // xml 컨텐트
...
HttpResponse<String> hresp = new WebClient().post(req -> // 또는 WebClient.get(...)
req.uri("http://host") // url 설정
.contentType(WebClient.Request.ContentType.XML) // content type 설정
.bodyData(xml) // xml 컨텐트를 요청 파라미터로 설정
);
String resp = hresp.body();
비동기 처리
XML 데이터를 비동기식으로 처리하려면 WebClient.Request에
async(true)
로 비동기 여부를 설정하고onResponse(Consumer)
로 응답 핸들러를 설정하여
처리한다. 다음은 사용방법을 보여주는 예다.
new WebClient().post(req -> // 또는 WebClient.get(...)
req.uri("http://host") // url 설정
.contentType(WebClient.Request.ContentType.XML) // content type 설정
.bodyData(xml) // xml 컨텐트를 요청 파라미터로 설정
.async(true) // 비동기 설정
.onResponse(hresp -> System.out.println(hresp.body())) // 응답 핸들러 설정
);
파일 다운로드
동기 처리
다음은 파일 다운로드 요청/응답을 동기식으로 통신하는 예다.
HttpResponse<InputStream> hresp = new WebClient().post(req -> // 또는 WebClient.get(...)
req.uri("http://host") // url 설정
.data("param-name0", "param-value0") // 파라미터 설정
.data("param-name1", "param-value1")
.download(true) // 다운로드 설정
);
try (
InputStream input = hresp.body();
FileOutputStream out = new FileOutputStream("저장파일 경로");
) {
input.transferTo(out); // 다운로드 파일 저장
} catch (Exception e) {
e.printStackTrace();
}
파일 저장 부분은 WebClient.write(InputStream, String)
을 사용해 간단히 할 수 있다.
비동기 처리
파일 다운로드를 비동기식으로 처리하려면 WebClient.Request에
- 'async(true)'로 비동기 여부를 설정하고
- 'download(true)'로 다운로드 여부를 설정하고
- 'onResponse(Consumer)'로 응답 핸들러를 설정하여
처리한다. 다음은 사용방법을 보여주는 예다.
WebClient webClient = new WebClient();
webClient.post(req -> // 또는 WebClient.get(...)
req.uri("http://host") // url 설정
.data("param-name0", "param-value0") // 파라미터 설정
.data("param-name1", "param-value1")
.download(true) // 다운로드 설정
.async(true)
.onDownload(hresp -> webClient.write(hresp.body())) // 응답 핸들러 설정
);