如何让HttpClient返回状态码和响应体?

IAm*_*aja 45 java http apache-httpclient-4.x

我试图让Apache HttpClient触发HTTP请求,然后显示HTTP响应代码(200,404,500等)以及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);
Run Code Online (Sandbox Code Playgroud)

所以我问:使用该v4.2.2库,如何从同一个client.execute(...)调用中获取状态代码和响应正文?提前致谢!

Avi*_*gal 49

不要提供处理程序execute.

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

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

  • 这仅适用于2xx状态,其他人在使用BasicResponseHandler时会抛出,请参阅我的[answer](http://stackoverflow.com/a/26285342/300053). (3认同)

lka*_*mal 32

您可以避免使用BasicResponseHandler,但使用HttpResponse本身将状态和响应都作为String获取.

HttpResponse response = httpClient.execute(get);

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

// Getting the response body.
String responseBody = EntityUtils.toString(response.getEntity());
Run Code Online (Sandbox Code Playgroud)


esk*_*tos 13

如果状态不是2xx,则抛出BasicResponseHandler.看它的javadoc.

我将如何做到这一点:

HttpResponse response = client.execute( get );
int code = response.getStatusLine().getStatusCode();
InputStream body = response.getEntity().getContent();
// Read the body stream
Run Code Online (Sandbox Code Playgroud)

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


Edw*_*Lee 5

流畅的外观 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());
}
Run Code Online (Sandbox Code Playgroud)