홈 › 중급 › 09 / 9

HTTP 와 JSON 기초

요청·응답 구조, 메서드, 상태 코드, HttpClient, JSON 직렬화
섹션 7진행 0 / 9

4. 응용 변형 예제

변형 1: 파일로 바로 저장 (ofFile)

java
HttpClient raw = HttpClient.newHttpClient();
HttpRequest req = HttpRequest.newBuilder(URI.create(base + "/members/1")).GET().build();
HttpResponse<Path> res = raw.send(req,
        HttpResponse.BodyHandlers.ofFile(Path.of("member-1.json")));
System.out.println("저장 경로: " + res.body());   // member-1.json

응답 본문을 문자열로 메모리에 올리지 않고 바로 파일로 씁니다. 큰 첨부파일이나 이미지를 받을 때 씁니다.

변형 2: 폼 전송 (x-www-form-urlencoded)

java
String form = "name=" + URLEncoder.encode("김철수", StandardCharsets.UTF_8)
        + "&email=" + URLEncoder.encode("kim@test.com", StandardCharsets.UTF_8);
HttpRequest req = HttpRequest.newBuilder(URI.create(base + "/members"))
        .header("Content-Type", "application/x-www-form-urlencoded")
        .POST(HttpRequest.BodyPublishers.ofString(form))
        .build();

HTML <form> 이 기본으로 보내는 형식입니다. 이 레슨의 FakeApi 는 JSON 만 읽지만, 실무 서버는 두 형식을 함께 받는 경우가 많습니다.

변형 3: 비동기로 여러 요청 동시에

java
CompletableFuture<HttpResponse<String>> f1 = client.getAsync("/members/1");
CompletableFuture<HttpResponse<String>> f2 = client.getAsync("/members/2");
CompletableFuture.allOf(f1, f2).join();
System.out.println(f1.get().statusCode() + " " + f2.get().statusCode());

sendAsync 두 번은 순서대로 기다리지 않고 동시에 나갑니다. allOf(...).join() 으로 둘 다 끝날 때까지 기다린 뒤 결과를 꺼냅니다.

변형 4: 헤더로 인증 토큰 보내기

java
String token = "eyJhbGciOi...";
HttpRequest req = HttpRequest.newBuilder(URI.create(base + "/members"))
        .header("Authorization", "Bearer " + token)
        .GET().build();

토큰은 쿼리에 붙이지 않고 Authorization 헤더로 보냅니다. 쿼리는 서버 접근 로그에 그대로 남아 토큰이 노출될 수 있습니다.