【问题标题】:Is it possible to get both the status code and the body content when using Apache HttpClient's Facade? [duplicate]使用 Apache HttpClient 的 Facade 时是否可以同时获取状态码和正文内容? [复制]
【发布时间】:2014-03-14 15:28:55
【问题描述】:

我在一些示例代码中使用Apache's HttpClient Fluent Facade in Java 供开发人员扩展。他们真的很喜欢流畅的外观,它可以调用:

this.body = Request.Get(uri.build()).execute().returnContent().asString();

另外,我可以通过调用来获取状态码:

this.statusCode = Request.Get(uri.build()).execute().returnResponse().getStatusLine().getStatusCode();

不幸的是,在某些情况下,除了正文之外,我还需要状态码。基于this question,我看到我可以让他们学习 HttpClient 对象-

HttpResponse response = client.execute(httpGet);
String body = handler.handleResponse(response);
int code = response.getStatusLine().getStatusCode();

但是,这意味着初始化 HttpClient 对象并看似拒绝 Fluent 接口和 Request.Get(或 Post)语法。有没有办法在不丢失 Fluent 语法且不进行两次离散调用的情况下同时获取状态代码和正文 ?

【问题讨论】:

标签: java apache-httpclient-4.x fluent


【解决方案1】:

是的,虽然您必须自己处理 Response 对象。以下是我过去的做法示例:

org.apache.http.HttpResponse response = Request.Get(url)
    .connectTimeout(CONNECTION_TIMEOUT_MILLIS)
    .socketTimeout(SOCKET_TIMEOUT_MILLIS)
    .execute()
    .returnResponse();

int status = response.getStatusLine().getStatusCode();
byte[] serializedObject = EntityUtils.toByteArray(response.getEntity());

有几种方法可以使用 EntityUtils 检索正文内容。在这种情况下,我从缓存中检索序列化对象,但你明白了。我真的不相信这是对 Fluent API 的背离,但我想这是一个见仁见智的问题。问题是使用 Fluent returnXXX 方法时,响应会被完全消耗并关闭,因此您必须从响应本身中获取所需的东西。

【讨论】:

  • 只是吹毛求疵:使用 HC fluent 无需调用 EntityUtils#consume。
  • 谢谢!这正是我所需要的。
  • 感谢@oleg 的评论。现在更新代码。
  • HttpResponse 的全类名是什么? (即我需要导入什么才能让它工作?)
  • org.apache.http.HttpResponse。你应该经常查看 API 文档:hc.apache.org/httpcomponents-core-4.3.x/httpcore/apidocs/org/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-09
  • 2021-06-11
  • 1970-01-01
  • 1970-01-01
  • 2017-04-11
相关资源
最近更新 更多