我在一些示例代码中使用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语法而不进行两次离散调用?
答案 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方法,响应被完全消耗并关闭,因此您必须从响应本身获得所需的内容。