Java 如何让HttpClient返回状态代码和响应正文?

Java 如何让HttpClient返回状态代码和响应正文?,java,http,apache-httpclient-4.x,Java,Http,Apache Httpclient 4.x,我试图让ApacheHttpClient触发HTTP请求,然后显示HTTP响应代码(200404500等)以及HTTP响应正文(文本字符串)。需要注意的是,我使用的是v4.2.2,因为大多数HttpClient示例都来自v.3.x.x,并且API从版本3到版本4发生了很大变化 不幸的是,我只能让HttpClient返回状态码或响应体(但不是两者都返回) 以下是我所拥有的: // Getting the status code. HttpClient client = new DefaultHtt

我试图让ApacheHttpClient触发HTTP请求,然后显示HTTP响应代码(200404500等)以及HTTP响应正文(文本字符串)。需要注意的是,我使用的是
v4.2.2
,因为大多数HttpClient示例都来自
v.3.x.x
,并且API从版本3到版本4发生了很大变化

不幸的是,我只能让HttpClient返回状态码响应体(但不是两者都返回)

以下是我所拥有的:

// Getting the status code.
HttpClient client = new DefaultHttpClient();
HttpGet httpGet = new HttpGet("http://whatever.blah.com");
HttpResponse resp = client.execute(httpGet);

int statusCode = resp.getStatusLine().getStatusCode();


// Getting the response body.
HttpClient client = new DefaultHttpClient();
HttpGet httpGet = new HttpGet("http://whatever.blah.com");
ResponseHandler<String> handler = new BasicResponseHandler();

String body = client.execute(httpGet, handler);
//获取状态代码。
HttpClient=new DefaultHttpClient();
HttpGet HttpGet=新的HttpGet(“http://whatever.blah.com");
HttpResponse resp=client.execute(httpGet);
int statusCode=resp.getStatusLine().getStatusCode();
//获取响应主体。
HttpClient=new DefaultHttpClient();
HttpGet HttpGet=新的HttpGet(“http://whatever.blah.com");
ResponseHandler=new BasicResponseHandler();
String body=client.execute(httpGet,handler);

所以我问:使用
v4.2.2
库,如何从同一
客户端获取状态代码和响应正文。执行(…)
呼叫?
提前感谢

不要提供执行
的处理程序

获取
HttpResponse
对象,使用处理程序获取主体并直接从中获取状态代码

try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
    final HttpGet httpGet = new HttpGet(GET_URL);

    try (CloseableHttpResponse response = httpClient.execute(httpGet)) {
        StatusLine statusLine = response.getStatusLine();
        System.out.println(statusLine.getStatusCode() + " " + statusLine.getReasonPhrase());
        String responseBody = EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8);
        System.out.println("Response body: " + responseBody);
    }
}
对于快速单次调用,fluent API非常有用:

Response response = Request.Get(uri)
        .connectTimeout(MILLIS_ONE_SECOND)
        .socketTimeout(MILLIS_ONE_SECOND)
        .execute();
HttpResponse httpResponse = response.returnResponse();
StatusLine statusLine = httpResponse.getStatusLine();

对于旧版本的java或httpcomponents,代码可能看起来不同。

如果状态不是2xx,BasicResponseHandler将抛出。看看它

我会这样做:

HttpResponse response=client.execute(get);
int code=response.getStatusLine().getStatusCode();
InputStream body=response.getEntity().getContent();
//阅读身体流

或者,您也可以从BasicResponseHandler源开始编写一个ResponseHandler,当状态不是2xx时不会抛出它。

您可以避免使用BasicResponseHandler,但使用HttpResponse本身将状态和响应作为字符串获取

HttpResponse response = httpClient.execute(get);

// Getting the status code.
int statusCode = response.getStatusLine().getStatusCode();

// Getting the response body.
String responseBody = EntityUtils.toString(response.getEntity());
Fluent facade API:

Response response = Request.Get(uri)
        .connectTimeout(MILLIS_ONE_SECOND)
        .socketTimeout(MILLIS_ONE_SECOND)
        .execute();
HttpResponse httpResponse = response.returnResponse();
StatusLine statusLine = httpResponse.getStatusLine();
if (statusLine.getStatusCode() == HttpStatus.SC_OK) {
    // 响应内容编码自适应?(好像没那么智能)
    String responseContent = EntityUtils.toString(
            httpResponse.getEntity(), StandardCharsets.UTF_8.name());
}

如果您使用的是Spring

return new ResponseEntity<String>("your response", HttpStatus.ACCEPTED);
返回新的响应属性(“您的响应”,HttpStatus.ACCEPTED);

尝试从同一调用读取两个值时会发生什么?好吧,应该没问题。此外,请记住,对于错误代码,服务器可能根本不发送任何内容(例如,如果没有
which.blah.com
server)。请参阅,我已将此添加到jira板中,用于该项目,此功能仅适用于2xx状态,其他人在使用BasicResponseHandler时将抛出,请参阅我的。你救了我的一天,伙计。想知道如果没有这样的情况,开发世界会是什么样子。