java.net.http
Java 11 では、 HTTP 要求を行うための新しいパッケージ が導入されています。一般的な使用法では、かなり簡単です。
私の質問はjava.net.http
、各チャンクがクライアントによって受信されるときに、チャンクされた応答をどのように処理するのですか?
java.http.net
BodySubscriber
私が欲しいもののように見えるリアクティブが含まれていますが、それがどのように使用されているかの例が見つかりません。
http_get_demo.py
以下は、到着時にチャンクを出力する Python 実装です。java.net.http で同じことをしたいと思います。
import argparse
import requests
def main(url: str):
with requests.get(url, stream=True) as r:
for c in r.iter_content(chunk_size=1):
print(c.decode("UTF-8"), end="")
if __name__ == "__main__":
parser = argparse.ArgumentParser(
description="Read from a URL and print as text as chunks arrive")
parser.add_argument('url', type=str, help="A URL to read from")
args = parser.parse_args()
main(args.url)
HttpGetDemo.java
完全を期すために、java.net.http を使用してブロック リクエストを作成する簡単な例を次に示します。
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpResponse;
import java.net.http.HttpRequest;
public class HttpGetDemo {
public static void main(String[] args) throws Exception {
var request = HttpRequest.newBuilder()
.uri(URI.create(args[0]))
.build();
var bodyHandler = HttpResponse.BodyHandlers
.ofString();
var client = HttpClient.newHttpClient();
var response = client.send(request, bodyHandler);
System.out.println(response.body());
}
}
HttpAsyncGetDemo.java
そして、非ブロッキング/非同期リクエストを作成する例を次に示します。
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpResponse;
import java.net.http.HttpRequest;
/**
* ReadChunked
*/
public class HttpAsyncGetDemo {
public static void main(String[] args) throws Exception {
var request = HttpRequest.newBuilder()
.uri(URI.create(args[0]))
.build();
var bodyHandler = HttpResponse.BodyHandlers
.ofString();
var client = HttpClient.newHttpClient();
client.sendAsync(request, bodyHandler)
.thenApply(HttpResponse::body)
.thenAccept(System.out::println)
.join();
}
}