3.1 본문 게시자

요청, 즉 요청 본문 에 추가해야 할 때 GET 요청 외에 PUTPOST 요청 도 있다는 사실을 잊지 않았으면 합니다 .request body

이 클래스에는 이를 위한 HttpRequest특별한 내부 클래스가 있습니다 BodyPublisher. 기술적으로는 여러 구현이 있는 인터페이스이지만 아래에서 논의할 것입니다.

그리고 우리는 요청 본문이 없다는 가장 간단한 것부터 시작할 것입니다. 예, 발생합니다.


HttpRequest request = HttpRequest.newBuilder()
   .uri(new URI("https://codegym.cc"))
   .POST(HttpRequest.BodyPublishers.noBody())
   .build();

간단하고 아름답습니다.

3.2 ofString()

두 번째로 가장 일반적인 옵션은 일부 문자열을 요청 본문으로 전달하는 것입니다. 이것은 매우 간단하게 수행됩니다.


HttpRequest request = HttpRequest.newBuilder()
   .uri(new URI("https://codegym.cc"))
   .headers("Content-Type", "text/plain;charset=UTF-8")
   .POST(HttpRequest.BodyPublishers.ofString("Hello"))
   .build();

그건 그렇고, 전송되는 문자열의 인코딩을 설정할 수 있습니다. 요청을 보낸 http 서버가 UTF8에서 작동하지 않는 경우 매우 유용할 수 있습니다.


HttpRequest request = HttpRequest.newBuilder()
   .uri(new URI("https://codegym.cc"))
   .POST(HttpRequest.BodyPublishers.ofString("Hello", Charset. US-ASCII)))
   .build();

3.3 ofFile()

마지막으로 POST 요청 에 파일을 첨부할 수 있습니다 . 아바타가 일반적으로 서버에 업로드되는 방식입니다. 이렇게 하려면 로컬 파일을 ofFile()전송할 메서드를 호출해야 합니다.Path


Path avatar = Path.of("c://avatar.jpeg");
 
HttpRequest request = HttpRequest.newBuilder()
   .uri(new URI("https://codegym.cc"))
   .headers("Content-Type", "image/jpeg")
   .POST(HttpRequest.BodyPublishers.ofFile(avatar))
   .build();

3.4 ofByteArray()

또 다른 일반적인 시나리오는 바이트 세트를 서버로 보내는 것입니다. 예를 들어, 어떤 객체를 일련의 바이트로 직렬화하거나 무언가를 암호화하거나 일부 데이터 버퍼를 보내려고 합니다. 이것은 방법이 필요합니다 .ofByteArray().

이 메서드는 바이트 배열을 매개 변수로 사용합니다. 예:


byte[] data = "My Secret Message".getBytes();
byte[] dataEncripted = SuperEncriptor.encript(data);
 
HttpRequest request = HttpRequest.newBuilder()
   .uri(new URI("https://codegym.cc"))
   .headers("Content-Type", "application/octet-stream")
   .POST(HttpRequest.BodyPublishers.ofByteArray(dataEncripted))
   .build();

3.5 ofInputStream()

마지막으로 마지막으로 흥미로운 시나리오는 POST 요청InputStream 에 연결하는 것입니다 .

이를 위한 특별한 기능이 있습니다 ofInputStream(). 그리고 그녀는 매우 똑똑합니다. 스트림에서 스트림으로 데이터 전송을 구성하고 아직 공개되지 않은 POS 요청 에 데이터 스트림을 첨부할 수 있습니다 .

ofInputStream()결과로 스트림을 반환할 함수에 함수를 전달해야 합니다 InputStream.

예:


byte[] data = "My Secret Message".getBytes();
//wrapping an array of bytes into a stream.
InputStream is = new ByteArrayInputStream(data);
 
HttpRequest request = HttpRequest.newBuilder()
   .uri(new URI("https://codegym.cc"))
   .headers("Content-Type", "application/octet-stream")
   .POST(HttpRequest.BodyPublishers.ofInputStream (() -> is;))
   .build();

나는 여기 정원에 울타리를 치는 것을 귀찮게하지 않았지만 당신은 원리를 이해한다고 생각합니다. 그들은 왜 그렇게 했습니까? 거의 항상 ofByteArray(). 그러나 비동기적으로 데이터를 보내거나 특히 복잡한 시나리오를 구현해야 하는 경우 이 방법을 사용할 수 있습니다.