web-dev-qa-db-fra.com

Comment faire pour que HttpClient renvoie le code d'état et le corps de la réponse?

J'essaie de faire en sorte qu'Apache HttpClient envoie une requête HTTP, puis affiche le code de réponse HTTP (200, 404, 500, etc.) ainsi que le corps de la réponse HTTP (chaîne de texte). Il est important de noter que j'utilise v4.2.2 car la plupart des exemples HttpClient disponibles sont à partir de v.3.x.x et que l'API a considérablement changé de la version 3 à la version 4.

Malheureusement, j'ai seulement réussi à obtenir que HttpClient renvoie le code d'état ou le corps de la réponse (mais pas les deux).

Voici ce que j'ai

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

Je demande donc: À l'aide de la bibliothèque v4.2.2, comment puis-je obtenir le code d'état et le corps de la réponse à partir du même appel client.execute(...)? Merci d'avance!

39
IAmYourFaja

Ne fournissez pas le gestionnaire à execute.

Obtenez l'objet HttpResponse, utilisez le gestionnaire pour obtenir le corps et obtenez directement le code d'état

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

Vous pouvez éviter BasicResponseHandler, mais utilisez HttpResponse lui-même pour obtenir le statut et la réponse sous forme de chaîne.

HttpResponse response = httpClient.execute(get);

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

// Getting the response body.
String responseBody = EntityUtils.toString(response.getEntity());
20
lkamal

BasicResponseHandler renvoie si le statut n'est pas 2xx. Voir son javadoc .

Voici comment je le ferais:

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

Vous pouvez également écrire un ResponseHandler à partir de la source BasicResponseHandler qui ne lance pas lorsque le statut n'est pas 2xx.

11
eskatos

API de façade courante:

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

Si vous utilisez le printemps 

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