3 5. WebClient로 http 통신하기
hanmj edited this page 3 months ago

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&param-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())) // 응답 핸들러 설정
);