簡體   English   中英

如何使用 stream 和 java 11 http 客戶端編寫請求正文?

[英]How to write a request body using a stream with the java 11 http client?

舊版 java http 客戶端使用URLConnection.getOutputStream提供了一個OutputStream 例如,編寫 json 主體的工作方式如下:

final URLConnection urlConnection = ...;
try (OutputStreamWriter writer = new OutputStreamWriter(urlConnection.getOutputStream())) {
    new Gson().toJson(someJsonObject, writer);
}

使用新的 java 11 http 客戶端流式寫入請求正文的等效方法是什么?

我發現的唯一選擇是將整個 output 寫入Stringbyte[]並使用BodyPublishers.ofString/ofByteArray ,但是對於較大的請求,這對我來說似乎效率很低。

您可以使用MethanolWritableBodyPublisher 它允許您通過OutputStreamWritableByteChannel來 stream 請求正文。 當您編寫它時,發布者會在 memory 中緩沖正文。 如果您希望在寫入時發送它,您需要事先使用sendAsync或在另一個線程中進行寫入。 這有點類似於URLConnection的行為。

var publisher = WritableBodyPublisher.create();
var request = HttpRequest.newBuilder()
    .uri(URI.create("https://example.com"))
    .POST(publisher)
    .build();
var responseAsync = client.sendAsync(request, BodyHandlers.ofString());

try (var writer = new OutputStreamWriter(publisher.outputStream())) {
  new Gson().toJson(someJsonObject, writer);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM