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!
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();
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());
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.
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());
}
Si vous utilisez le printemps
return new ResponseEntity<String>("your response", HttpStatus.ACCEPTED);