web-dev-qa-db-fra.com

Comment obtenir un corps de réponse http sous forme de chaîne en Java?

Je sais qu'il y avait un moyen de l'obtenir avec Apache commons comme décrit ici: http://hc.Apache.org/httpclient-legacy/apidocs/org/Apache/commons/httpclient/HttpMethod.html et un exemple ici:

http://www.kodejava.org/examples/416.html

mais je crois que cela est obsolète . Y at-il un autre moyen de faire une requête http get en Java et d’obtenir le corps de la réponse sous forme de chaîne et non de flux? 

120
Danish94

Chaque bibliothèque que je peux penser renvoie un flux. Vous pouvez utiliser IOUtils.toString() from Apache Commons IO pour lire une InputStream dans une String dans un appel de méthode. Par exemple.:

URL url = new URL("http://www.example.com/");
URLConnection con = url.openConnection();
InputStream in = con.getInputStream();
String encoding = con.getContentEncoding();
encoding = encoding == null ? "UTF-8" : encoding;
String body = IOUtils.toString(in, encoding);
System.out.println(body);

Mise à jour: J'ai modifié l'exemple ci-dessus pour utiliser l'encodage du contenu de la réponse, si disponible. Sinon, UTF-8 sera utilisé par défaut au lieu d'utiliser la valeur par défaut du système local.

87
WhiteFang34

Voici deux exemples de mon projet de travail. 

  1. Utilisation de EntityUtils et HttpEntity

    HttpResponse response = httpClient.execute(new HttpGet(URL));
    HttpEntity entity = response.getEntity();
    String responseString = EntityUtils.toString(entity, "UTF-8");
    System.out.println(responseString);
    
  2. Utilisation de BasicResponseHandler

    HttpResponse response = httpClient.execute(new HttpGet(URL));
    String responseString = new BasicResponseHandler().handleResponse(response);
    System.out.println(responseString);
    
228
spideringweb

Voici un exemple tiré d'un autre projet simple sur lequel je travaillais en utilisant la bibliothèque httpclient d'Apache:

String response = new String();
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);
nameValuePairs.add(new BasicNameValuePair("j", request));
HttpEntity requestEntity = new UrlEncodedFormEntity(nameValuePairs);

HttpPost httpPost = new HttpPost(mURI);
httpPost.setEntity(requestEntity);
HttpResponse httpResponse = mHttpClient.execute(httpPost);
HttpEntity responseEntity = httpResponse.getEntity();
if(responseEntity!=null) {
    response = EntityUtils.toString(responseEntity);
}

utilisez simplement EntityUtils pour saisir le corps de la réponse sous forme de chaîne. très simple.

45
moonlightcheese

Ceci est relativement simple dans le cas spécifique, mais assez délicat dans le cas général.

HttpClient httpclient = new DefaultHttpClient();
HttpGet httpget = new HttpGet("http://stackoverflow.com/");
HttpResponse response = httpclient.execute(httpget);
HttpEntity entity = response.getEntity();
System.out.println(EntityUtils.getContentMimeType(entity));
System.out.println(EntityUtils.getContentCharSet(entity));

La réponse dépend du Content-Type _ { en-tête de la réponse HTTP } _.

Cet en-tête contient des informations sur la charge utile et might définit le codage des données textuelles. Même si vous supposez que types de texte } _, vous devrez peut-être inspecter le contenu lui-même afin de déterminer le codage correct des caractères. Par exemple. voir la spécification HTML 4 pour plus d'informations sur la procédure à suivre pour ce format particulier.

Une fois le codage connu, un InputStreamReader peut être utilisé pour décoder les données.

Cette réponse dépend du serveur qui agit comme il convient. Si vous souhaitez gérer les cas où les en-têtes de réponse ne correspondent pas au document ou si les déclarations de document ne correspondent pas à l'encodage utilisé, il s'agit d'une autre façon.

27
McDowell

Pourquoi pas ça?

org.Apache.commons.io.IOUtils.toString(new URL("http://www.someurl.com/"));
8
Eric Schlenz

Vous trouverez ci-dessous un moyen simple d'accéder à la réponse sous forme de chaîne à l'aide de la bibliothèque Apache HTTP Client.

import org.Apache.http.HttpResponse;
import org.Apache.http.client.HttpClient;
import org.Apache.http.client.ResponseHandler;
import org.Apache.http.client.methods.HttpGet;
import org.Apache.http.impl.client.BasicResponseHandler;

//... 

HttpGet get;
HttpClient httpClient;

// initialize variables above

ResponseHandler<String> responseHandler = new BasicResponseHandler();
String responseBody = httpClient.execute(get, responseHandler);
8
lkamal

La réponse de McDowell est la bonne. Cependant, si vous essayez d'autres suggestions dans quelques-uns des articles ci-dessus.

HttpEntity responseEntity = httpResponse.getEntity();
if(responseEntity!=null) {
   response = EntityUtils.toString(responseEntity);
   S.O.P (response);
}

Ensuite, il vous donnera illégaleStateException indiquant que le contenu est déjà consommé.

6
Akshay

Nous pouvons également utiliser le code ci-dessous pour obtenir la réponse HTML en Java

import org.Apache.http.client.HttpClient;
import org.Apache.http.client.methods.HttpGet;
import org.Apache.http.impl.client.DefaultHttpClient;
import org.Apache.http.HttpResponse;
import Java.io.BufferedReader;
import Java.io.InputStreamReader;
import org.Apache.log4j.Logger;

public static void main(String[] args) throws Exception {
    HttpClient client = new DefaultHttpClient();
    //  args[0] :-  http://hostname:8080/abc/xyz/CheckResponse
    HttpGet request1 = new HttpGet(args[0]);
    HttpResponse response1 = client.execute(request1);
    int code = response1.getStatusLine().getStatusCode();

    try (BufferedReader br = new BufferedReader(new InputStreamReader((response1.getEntity().getContent())));) {
        // Read in all of the post results into a String.
        String output = "";
        Boolean keepGoing = true;
        while (keepGoing) {
            String currentLine = br.readLine();

            if (currentLine == null) {
                keepGoing = false;
            } else {
                output += currentLine;
            }
        }

        System.out.println("Response-->" + output);
    } catch (Exception e) {
        System.out.println("Exception" + e);

    }
}
2
Subhasish Sahu

Voici un moyen léger de le faire:

String responseString = "";
for (int i = 0; i < response.getEntity().getContentLength(); i++) { 
    responseString +=
    Character.toString((char)response.getEntity().getContent().read()); 
}

Bien sûr, responseString contenant la réponse du site Web et la réponse étant du type HttpResponse, renvoyé par HttpClient.execute(request)

0
Marko Zajc

Si vous utilisez Jackson pour désérialiser le corps de la réponse, une solution très simple consiste à utiliser request.getResponseBodyAsStream() au lieu de request.getResponseBodyAsString()

0
Vic Seedoubleyew

Vous pouvez utiliser une bibliothèque de partie 3D qui envoie une requête HTTP et gère la réponse. Un des produits bien connus serait Apache commons HTTPClient: HttpClient javadoc , HttpClient Maven artefact . HTTPClient est beaucoup moins connu mais beaucoup plus simple (partie d'une bibliothèque open source MgntUtils écrite par moi): MgntUtils HttpClient javadoc , MgntUtils maven artefact , MgntUtils Github . À l'aide de l'une de ces bibliothèques, vous pouvez envoyer votre demande REST et recevoir une réponse indépendamment de Spring dans le cadre de votre logique métier.

0
Michael Gantman

Voici l'extrait de code qui montre un meilleur moyen de gérer le corps de la réponse sous forme de chaîne, qu'il s'agisse d'une réponse valide ou d'une réponse d'erreur pour la demande HTTP POST:

BufferedReader reader = null;
OutputStream os = null;
String payload = "";
try {
    URL url1 = new URL("YOUR_URL");
    HttpURLConnection postConnection = (HttpURLConnection) url1.openConnection();
    postConnection.setRequestMethod("POST");
    postConnection.setRequestProperty("Content-Type", "application/json");
    postConnection.setDoOutput(true);
    os = postConnection.getOutputStream();
    os.write(eventContext.getMessage().getPayloadAsString().getBytes());
    os.flush();

    String line;
    try{
        reader = new BufferedReader(new InputStreamReader(postConnection.getInputStream()));
    }
    catch(IOException e){
        if(reader == null)
            reader = new BufferedReader(new InputStreamReader(postConnection.getErrorStream()));
    }
    while ((line = reader.readLine()) != null)
        payload += line.toString();
}       
catch (Exception ex) {
            log.error("Post request Failed with message: " + ex.getMessage(), ex);
} finally {
    try {
        reader.close();
        os.close();
    } catch (IOException e) {
        log.error(e.getMessage(), e);
        return null;
    }
}
0
Krutik