3.1 主體發布者
希望你沒有忘記,除了GET請求,還有PUT和POST請求,這時你還需要在請求中添加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()
最後,最後但並非最不重要的場景是附加InputStream
到POST 請求。
為此有一個特殊的功能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()
. 但是如果你想異步發送數據或者你需要實現一些特別複雜的場景,那麼你可以使用這個方法。
GO TO FULL VERSION