4.1 send() 메서드, BodyHandlers

http 요청을 구성하는 방법 학습을 마쳤 으므로 가장 중요한 이 요청 보내기로 이동할 수 있습니다. 가장 간단한 경우 다음과 같이 하기 쉽습니다.


HttpRequest request = HttpRequest.newBuilder(new URI("https://codegym.cc")).build();
 
   HttpClient client = HttpClient.newBuilder()
        .version(Version.HTTP_1_1)
        .build();
 
   HttpResponse<String> response = client.send(request, BodyHandlers.ofString());
   System.out.println(response.statusCode() );
   System.out.println(response.body() ); 

그리고 BodyHandlers이것들은 무엇입니까? 어떻게 생각하나요? 요청을 보냈습니다. 즉, 응답을 받아야 합니다. - http response. response body그리고 이 응답은 문자열, 파일, 바이트 배열, InputStream을 가질 수 있습니다 .

예, 예, 맞습니다. response body요청을 작성할 때와 마찬가지로 응답 유형을 지정해야 합니다 . 총 8개의 조각이 있을 수 있습니다.

  • BodyHandlers.ofByteArray
  • BodyHandlers.ofString
  • BodyHandlers.ofFile
  • BodyHandlers.discarding
  • BodyHandlers.replacing
  • BodyHandlers.ofLines
  • BodyHandlers.fromLineSubscriber

BodyHandlers메서드에 전달한 유형에 따라 send()이러한 결과 유형을 반환합니다. 예:

// response body is ignored
HttpResponse<Void> response = client.send(request, BodyHandlers.discarding());
// response body is a string
 HttpResponse<String>response = client.send(request, BodyHandlers.ofString());
// response body is a file
HttpResponse<Path> response = client.send(request, BodyHandlers.ofFile(Paths.get("readme.txt")));
// response body is an InputStream
HttpResponse<InputStream> response = client.send(request, BodyHandlers.ofInputStream());

응답으로 파일을 보내야 하는 경우 BodyHandlers.ofFile()로컬 파일의 이름을 메서드에 전달해야 합니다. 그러면 HttpClient 개체에 의해 저장됩니다.

4.2 followRedirects() 메서드

또한 요청을 보낼 때 서버가 응답으로 보내는 경우 301또는 302(임시 또는 영구 리디렉션) HttpClient가 수행해야 하는 작업을 지정할 수 있습니다. 서버가 코드를 전송했다고 상상해보십시오 302. 이 상황을 추적하고, 응답에서 새 URL을 얻고, 새 주소로 요청을 보내야 합니다.

특히 이 상황이 일반적이고 오랫동안 모든 http 클라이언트에서 자동화되어 왔다는 점을 고려하면 이 작업을 별로 하고 싶지 않습니다. 또한 이 HttpClient에서는 요청을 보낼 때 선택한 리디렉션 모드를 지정하기만 하면 됩니다.

HttpResponse response = HttpClient.newBuilder()
  .followRedirects( HttpClient.Redirect.ALWAYS )
  .build()
  .send(request, BodyHandlers.ofString());

리디렉션에는 3가지 옵션만 있습니다.

  • 항상 - 항상;
  • 절대 - 절대로;
  • NORMAL - HTTPS -> HTTP를 제외한 항상.

보시다시피 여기에는 옵션이 많지 않지만 사용자 지정 기능이 없는 것보다 있는 것이 항상 더 좋습니다.

4.4 프록시() 메서드

몇 가지 더 유용하지만 자주 사용되지 않는 옵션이 있습니다. 필요할 때까지 정확히 필요하지 않습니다 :)

첫 번째는 프록시입니다. 일상 생활에서는 자주 접하지 않지만 많은 대기업에는 내부에 복잡한 인터넷 트래픽 보안 시스템이 있으므로 다양한 프록시 설정이 있습니다.

물론 그러한 기업의 내부 어딘가에서 작동할 귀하의 소프트웨어는 언젠가는 프록시를 사용해야 한다는 사실에 직면하게 될 것입니다. 따라서 이러한 옵션도 여기에 있는 것이 좋습니다.

프록시 설정은 매우 간단합니다. 예를 들면 다음과 같습니다.

HttpResponse<String> response = HttpClient.newBuilder()
  .proxy( ProxySelector.getDefault())
  .build()
  .send(request, BodyHandlers.ofString());

여기에서 기본 프록시가 선택되었지만 직접 설정할 수 있습니다.

HttpResponse response = HttpClient.newBuilder()
  .proxy(ProxySelector.of(new InetSocketAddress("proxy.microsoft.com", 80)))
  .build()
  .send(request, BodyHandlers.ofString());

프록시로 정확히 작업하는 방법은 이 과정의 범위에 포함되지 않으므로 고려하지 않습니다.

4.5 인증자()

그리고 한 가지 더 중요한 점. HTTP 프로토콜은 인증을 지원합니다. 프로토콜 수준에서 바로.

지금은 이 접근 방식이 거의 사용되지 않지만 약 20년 전에는 일반적이었습니다. HTTP 요청은 다음과 같습니다.

http://username@example.com/

또는 다음과 같이 할 수도 있습니다.

http://username:password@example.com/

이것은 메일이 아닙니다. 이것이 바로 링크입니다. 그리고 네, 당신은 그렇게 생각하지 않았습니다. 로그인과 암호까지 http 요청에 직접 지정할 수 있습니다. 예, 지금도 가능합니다. 그래서 지금은 아무도 보통 그렇게하지 않는다고 씁니다. 그러나 그런 가능성이 있습니다.

Authenticator auth = new Authenticator() {
    @Override
    protected PasswordAuthentication getPasswordAuthentication() {
    return new PasswordAuthentication(
     "username",
        "password".toCharArray());
    }
};

HttpResponse<String> response = HttpClient.newBuilder()
  .authenticator(auth).build()
  .send(request, BodyHandlers.ofString());

이건 재미 있네! “password"코드 대신에 왜 그런지 아십니까 "password".toCharArray()?

생성자의 두 번째 매개변수가 가 아니라 이기 때문 PasswordAuthentication 입니다 .StringCharArray

그리고 두 번째 매개변수가 아닌 이유는 String무엇입니까 CharArray?

모든 암호는 보안 목적을 위해 전체 문자열로 저장할 수 없기 때문에 자체 애플리케이션에서도 마찬가지입니다 . 즉, 메모리에 있는 애플리케이션은 암호를 문자열로 저장하면 안 됩니다. 누군가 축축한 메모리를 만들면 암호를 빼낼 수 없습니다 ...

그러나 동시에 암호는 안전하지 않은 HTTP 프로토콜을 통해 전 세계의 절반에 걸쳐 전송될 수 있습니다 :) :) :)

잘. 세상은 완벽하지 않습니다.

아래 링크에서 이 주제에 대한 자세한 내용을 읽을 수 있습니다.

HTTP 인증

HTTP 인증 이해