【问题标题】:How to acquire the response body from Apache HttpClient5's HttpResponse?如何从 Apache HttpClient5 的 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的好文章,我看了一篇还不清楚

标签: apache-httpclient-5.x


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-19
    • 1970-01-01
    • 2018-01-26
    • 2019-02-08
    • 2020-08-10
    • 1970-01-01
    • 2020-03-23
    相关资源
    最近更新 更多