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()

最後,最後但並非最不重要的場景是附加InputStreamPOST 請求

為此有一個特殊的功能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(). 但是如果你想異步發送數據或者你需要實現一些特別複雜的場景,那麼你可以使用這個方法。