使用Apache HttpClient的Facade时,是否可以同时获取状态代码和正文内容?

时间:2014-03-14 15:28:55

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

我在一些示例代码中使用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语法而不进行两次离散调用?

1 个答案:

答案 0 :(得分:13)

是的,虽然您必须自己处理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方法,响应被完全消耗并关闭,因此您必须从响应本身获得所需的内容。