Java 11 引入了一个新包java.net.http,用于发出 HTTP 请求。对于一般用途,它非常简单。我的问题是:java.net.http当客户端收到每个块时,我该如何处理分块响应?java.http.net包含一个BodySubscriber似乎是我想要的反应式,但我找不到它如何使用的示例。http_get_demo.py下面是一个 python 实现,它在块到达时打印块,我想用 java.net.http 做同样的事情:import argparseimport requestsdef 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(); }}
添加回答
举报
0/150
提交
取消