Java HttpClient 클래스

HttpClient 클래스

public static HttpClient new HttpClient()

HttpClient 클래스는 Java 11에서 추가된 새로운 HTTP 클라이언트로 다음과 같은 특징을 가지고 있다.

  • HTTP/2을 지원한다.
  • WebSocket 통신(=경량인 양방향 통신)을 지원한다.
  • 비동기 메소드를 제공한다.

HttpClient 클래스 사용

아래에서는 지정된 URL로부터 컨텐츠를 받아와서, 그 내용을 출력하는 예를 통해 HttpClient에 의한 통신에 살펴보겠다.

HttpConnect.java

package com.devkuma.basic.http;

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class HttpConnect {
    public static void main(String[] args) throws InterruptedException {
        // 1. HttpClient을 생성
        HttpClient cli = HttpClient.newBuilder()
                                   .version(HttpClient.Version.HTTP_2)
                                   .build();
        // 2. HttpRequest을 생성
        HttpRequest request = HttpRequest.newBuilder()
                                         .uri(URI.create("https://www.devkuma.com/"))
                                         .build();
        // 3. Requset을 송신
        cli.sendAsync(request, HttpResponse.BodyHandlers.ofString())
           // 4. Response을 수신
           .thenAccept(response -> {
               System.out.println(response.body());
           });

        Thread.sleep(3000);
    }
}

실행 결과:

<!doctype html>
<html itemscope itemtype="http://schema.org/WebPage" lang="ko" class="no-js">
  <head>
    <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="generator" content="Hugo 0.101.0" />
<meta name="robots" content="index, follow">

...이하 생략...

1. HttpClient 객체 생성

HttpClient 클래스는 HTTP 통신 자체를 관리한다. HttpClient 객체를 생성하려면 builder 메서드에서 HttpClient.Builder 객체(=HttpClient를 생성하기 위한 빌더)를 생성한 후에 그 setter에서 HTTP 통신의 거동을 설정한다.

메소드 설정 내용
HttpClient.Builder authenticator(Authenticator auth) 인증 코드(HTTP 인증)
HttpClient.Builder connectTimeout(Duration duration) 연결 시간 초과 시간
HttpClient.Builder cookieHandler(CookieHandler cookie) 쿠키를 조작하기 위한 핸들러
HttpClient.Builder followRedirects(HttpClient.Redirect policy) 리디렉션을 자동으로 따르는지 여부를 지정
HttpClient.Builder priority(int priority) HTTP/2 요청 우선순위
HttpClient.Builder version(HttpClient.Version version) HTTP 버전

HttpClient.Builder 인터페이스의 주요 setter 메서드

마지막으로 build 메서드를 호출하여 이전 설정을 기반으로 HttpClient 객체를 생성할 수 있다.

2. HttpRequest 객체 생성

HttpRequest 클래스는 HTTP 요청을 관리한다. builder 메서드로 빌더(HttpRequest.Builder)를 생성한 후에 setter로 리퀘스트 정보를 설정하고, build 메소드로 HttpRequest 객체를 생성한다. 이 흐름은 HttpClient의 경우와 같다.

아래에 HttpRequest.Builder 클래스의 주요 Setter를 요약한다.

메소드 설정 내용
HttpRequest.Builder DELETE() 요청 메소드(DELETE)
HttpRequest.Builder GET() 요청 메소드(GET)
HttpRequest.Builder POST(HttpRequest.BodyPublisher pub) 요청 메서드(POST)
HttpRequest.Builder PUT(HttpRequest.BodyPublisher pub) 요청 메서드(PUT)
HttpRequest.Builder method(String method, HttpRequest.BodyPublisher body) 요청 메서드 및 요청 본문
HttpRequest.Builder setHeader(String name, String value) 요청 헤더
HttpRequest.Builder timeout(Duration duration) 요청 시간 초과 시간
HttpRequest.Builder uri(URI uri) 요청 URI

HttpRequest.Builder 클래스의 주요 setter 메서드

3. Request 송신

HttpClient/HttpRequest를 생성한 후에는 sendAsync 메소드로 요청을 보내면 된다.

sendAsync 메서드

public abstract <T> CompletableFuture<HttpResponse<T>> sendAsync(
    HttpRequest request, HttpResponse.BodyHandler<T> responseBodyHandler)
  T: 응답 본문 유형
  request: 요청 정보
  responseBodyHandler: 응답 본문을 위한 핸들러

responseBodyHandler 인수는 응답을 처리하는 핸들러이다. HttpResponse.BodyHandlers 클래스의 정적 메서드로 생성할 수 있다.

메소드 응답 Body의 유형
HttpResponse.BodyHandler<String> ofString([Charset charset]) 문자열
HttpResponse.BodyHandler<Stream<String>> ofLines() 스트림
HttpResponse.BodyHandler<Path> ofFile(Path file [,OpenOption... openOptions]) 파일
HttpResponse.BodyHandler<InputStream> ofInputStream() 입력 스트림
HttpResponse.BodyHandler<byte[]> ofByteArray() 바이트 배열

HttpResponse.BodyHandlers 클래스의 주요 정적 메서드

이 예제에서는 ofString 메서드으로 응답 본문을 문자열로 가져온다.

4. Response 수신

sendAsync 메서드에 의한 요청의 결과를 처리하는 것은 thenAccept 메서드의 역할이다. 인수의 람다 식으로 HttpResponse 객체(response)를 받다. 여기에서는 그 body 메소드로 본문을 반환하고 출력하고 있다.

아래에 HttpResponse 객체의 주요 메소드를 정리한다.

메소드 반환 내용
T body() 본문
HttpHeaders headers() 응답 헤더
int statusCode() 상태 코드
URI uri() URI

HttpResponse 클래스의 주요 Getter