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