wake-up-neo.com

Wie kann ich in Java einen http-Antworttext als String erhalten?

Ich weiß, dass es eine Möglichkeit gab, Apache Commons wie hier beschrieben zu erhalten: http://hc.Apache.org/httpclient-legacy/apidocs/org/Apache/commons/httpclient/HttpMethod.html und ein Beispiel hier:

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

aber ich glaube, das ist veraltet .. Gibt es eine andere Möglichkeit, eine http-Anforderung in Java abzufragen und den Antworttext als String und nicht als Stream abzurufen? 

120
Danish94

Jede Bibliothek, die mir einfällt, liefert einen Stream. Sie können IOUtils.toString() aus Apache Commons IO verwenden, um eine InputStream in eine String in einem Methodenaufruf zu lesen. Z.B.:

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

Update: Ich habe das obige Beispiel geändert, um die Inhaltskodierung aus der Antwort zu verwenden, falls verfügbar. Andernfalls wird UTF-8 standardmäßig empfohlen, anstatt die Standardeinstellung des lokalen Systems zu verwenden.

87
WhiteFang34

Hier sind zwei Beispiele aus meinem Arbeitsprojekt. 

  1. EntityUtils und HttpEntity

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

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

Hier ein Beispiel aus einem anderen einfachen Projekt, an dem ich mit der httpclient-Bibliothek von Apache gearbeitet habe:

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

verwenden Sie einfach EntityUtils, um den Antworttext als String zu erfassen. sehr einfach.

45
moonlightcheese

Dies ist im konkreten Fall relativ einfach, im allgemeinen Fall jedoch recht kompliziert.

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

Die Antwort hängt vom Content-TypeHTTP-Antwortheader ab.

Dieser Header enthält Informationen zu den Nutzdaten, und könnte definiert die Kodierung von Textdaten. Selbst wenn Sie von Texttypen ausgehen, müssen Sie möglicherweise den Inhalt selbst prüfen, um die korrekte Zeichenkodierung zu bestimmen. Z. Siehe HTML 4 spec für Details, wie Sie dies für dieses bestimmte Format tun können.

Sobald die Codierung bekannt ist, kann ein InputStreamReader zum Decodieren der Daten verwendet werden.

Diese Antwort hängt davon ab, ob der Server das Richtige tut. Wenn Sie Fälle behandeln möchten, bei denen die Antwortheader nicht mit dem Dokument übereinstimmen oder die Dokumentdeklarationen nicht mit der verwendeten Codierung übereinstimmen, ist dies ein weiterer Fischtopf.

27
McDowell

Wie wäre es damit?

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

Im Folgenden finden Sie eine einfache Möglichkeit, mit der Apache HTTP Client-Bibliothek als Antwort auf die Antwort zuzugreifen.

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

Die Antwort von McDowell ist richtig. Wenn Sie jedoch einen anderen Vorschlag in einigen der obigen Beiträge ausprobieren.

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

Dann wird illegalStateException darauf hingewiesen, dass der Inhalt bereits verbraucht ist.

6
Akshay

Wir können den folgenden Code auch verwenden, um die HTML-Antwort in Java abzurufen

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

Hier ist eine einfache Möglichkeit, dies zu tun:

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

Natürlich enthält responseString die Antwort und Antwort der Website als HttpResponse-Typ, der von HttpClient.execute(request) zurückgegeben wird.

0
Marko Zajc

Wenn Sie Jackson verwenden, um den Antworttext zu deserialisieren, besteht eine sehr einfache Lösung darin, request.getResponseBodyAsStream() anstelle von zu verwenden request.getResponseBodyAsString()

0

Sie können eine Drittanbieter-Bibliothek verwenden, die HTTP-Anforderungen sendet und die Antwort verarbeitet. Eines der bekanntesten Produkte wäre der Apache-Commons-HTTP-Client: HttpClient javadoc , HttpClient Maven-Artefakt . Es gibt einen weitaus weniger bekannten, aber viel einfacheren HTTPClient (Teil einer von mir geschriebenen Open-Source-MgntUtils-Bibliothek): MgntUtils HttpClient javadoc , MgntUtils maven artifact , MgntUtils Github . Mit einer dieser Bibliotheken können Sie Ihre REST -Anforderung senden und als Teil Ihrer Geschäftslogik unabhängig von Spring eine Antwort erhalten

0
Michael Gantman

Das folgende Code-Snippet zeigt, wie der Antworttext als String besser behandelt werden kann, unabhängig davon, ob es sich um eine gültige Antwort oder eine Fehlerantwort für die HTTP-Anforderung POST handelt:

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