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

Aff*_*eek 8 java fluent apache-httpclient-4.x

在Java中使用Apache的HttpClient Fluent Facade中的一些示例代码供开发人员扩展.他们真的很喜欢流利的外观,能够打电话:

this.body = Request.Get(uri.build()).execute().returnContent().asString();
Run Code Online (Sandbox Code Playgroud)

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

this.statusCode = Request.Get(uri.build()).execute().returnResponse().getStatusLine().getStatusCode();
Run Code Online (Sandbox Code Playgroud)

不幸的是,有几个实例我需要除了正文之外的状态代码.根据这个问题,我看到我可以让他们学习HttpClient对象 -

HttpResponse response = client.execute(httpGet);
String body = handler.handleResponse(response);
int code = response.getStatusLine().getStatusCode();
Run Code Online (Sandbox Code Playgroud)

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

jgi*_*ter 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());
Run Code Online (Sandbox Code Playgroud)

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