如何从 Apache HttpClient5 的 HttpResponse 中获取响应体?

Posted

技术标签:

【中文标题】如何从 Apache HttpClient5 的 HttpResponse 中获取响应体?【英文标题】:How to acquire the response body from Apache HttpClient5's HttpResponse? 【发布时间】:2020-08-27 20:19:23 【问题描述】:

在版本 4 中获取状态码和响应正文非常简单:

StringEntity entity = new StringEntity(jsonData.toString());
HttpResponse r = org.apache.http.client.fluent.Request.Post(uri)
        .connectTimeout(10*1000)
        .socketTimeout(10*1000)
        .addHeader("Content-Type", "application/json; charset=utf-8")
        .body(entity)
        .execute()
        .returnResponse();
int status = r.getStatusLine().getStatusCode();
String body = EntityUtils.toString(r.getEntity(), "UTF-8");
return new CoolResponse(status, body);

但现在在 httpclient5 中,由于某种原因,无法从 HttpResponse 获取与响应正文相关的任何内容。对此非常困惑。如果我在他们的快速入门 (https://hc.apache.org/httpcomponents-client-5.0.x/quickstart.html) 中遵循示例 3,它建议我创建一个 CloseableHttpClient、一个 HttpGet 和一个 CloseableHttpResponse,但这些都不允许您设置连接超时。试图找到两全其美的选择,但这里的选项似乎有点混乱。

【问题讨论】:

我不明白。您是在询问响应正文(您可以使用getEntity 获得,如链接示例中所示)还是在询问超时(您可以在HttpGet 和/或HttpClient 中看到)? 文章建议使用 getEntity() 的方式似乎与我设置超时的方式不兼容。我不知道它可以在http客户端设置。但是我看到您可以在 SimpleHttpRequest 的配置中设置超时,所以我认为这是正确的方法。不知道还有没有其他关于hc5的好文章,我看了一篇还不清楚 【参考方案1】:

快速入门中没有提到,但在 fluent API 中,您可以使用 handleResponse() 跟进 execute() 并将其传递给 lambda。

我最终找到了一篇比这里的快速入门更好的文章: https://ok2c.github.io/httpclient-migration-guide/migration-to-classic.html

【讨论】:

以上是关于如何从 Apache HttpClient5 的 HttpResponse 中获取响应体?的主要内容,如果未能解决你的问题,请参考以下文章

HttpClient5.0,如何在异步模式下使用gzip?

在httpclient5中实现HttpRequestRetryHandler和RequestBuilder

用HttpClient5多次上传PDF文件到OSS时,头文件信息被多次追加问题

精通系列-案例开发-巨细HttpClient5 + jsoup + WebMagic + spider-flow万字长文一篇文章学会

精通系列-案例开发-巨细HttpClient5 + jsoup + WebMagic + spider-flow万字长文一篇文章学会

精通系列-案例开发-巨细HttpClient5 + jsoup + WebMagic + spider-flow万字长文一篇文章学会