59

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);

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

4

5 に答える 5

70

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

オブジェクトを取得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);
    }
}

素早いシングルコールには、流暢な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の場合、コードは異なって見える場合があります。

于 2012-12-24T18:39:59.543 に答える
36

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());
于 2016-01-12T10:12:08.400 に答える
15

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

これが私がそれをする方法です:

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

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

于 2014-10-09T18:16:46.873 に答える
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());
}
于 2016-11-27T16:26:43.510 に答える
1

Springを使用している場合

return new ResponseEntity<String>("your response", HttpStatus.ACCEPTED);
于 2017-03-15T15:22:18.103 に答える