This question already has answers here:
How to get HttpClient returning status code and response body?

(5个答案)


2年前关闭。




我在一些示例代码中使用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接口(interface)和Request.Get(或Post)语法。有没有一种方法既可以获取状态代码又可以获取主体,而又不会丢失Fluent语法并且不会进行两次离散调用?

最佳答案

是的,是的,尽管您必须自己处理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方法,响应将被完全消耗并关闭,因此您必须从响应本身中获取所需的东西。

10-05 22:43