web-dev-qa-db-ja.com

HttpClientがステータスコードと応答本文を返すようにする方法は?

Apache HttpClientにHTTPリクエストを実行させ、HTTPレスポンスコード(200、404、500など)とHTTPレスポンスボディ(テキスト文字列)を表示しようとしています。ほとんどのHttpClientの例は_v4.2.2_からのものであり、APIはバージョン3からバージョン4に大きく変わったため、_v.3.x.x_を使用していることに注意することが重要です。

残念ながら、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);
_

そこで私は尋ねます:_v4.2.2_ライブラリを使用して、同じclient.execute(...)呼び出しからステータスコードと応答本文の両方を取得するにはどうすればよいですか?事前に感謝します!

44
IAmYourFaja

executeにハンドラーを提供しないでください。

HttpResponseオブジェクトを取得し、ハンドラーを使用して本体を取得し、そこからステータスコードを直接取得します

HttpResponse response = client.execute(httpGet);
String body = handler.handleResponse(response);
int code = response.getStatusLine().getStatusCode();
47
Aviram Segal

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());
30
lkamal

BasicResponseHandlerは、ステータスが2xxでない場合にスローされます。 javadoc を参照してください。

ここに私がそれをする方法があります:

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

または、ステータスが2xxでない場合にスローしないBasicResponseHandlerソースから開始するResponseHandlerを記述することもできます。

13
eskatos

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());
}
3
Edward Lee

Springを使用している場合

        return  new ResponseEntity<String>("your response", HttpStatus.ACCEPTED);
0
vsingh