当块到达时,如何使用 java.net.http 读取和打印分块的 HTTP 响应?

Java 11 引入了一个新包java.net.http,用于发出 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();


  }

}


POPMUISE
浏览 199回答 3
3回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java