Wie kann ich einen HTTP-Antworttext als Zeichenfolge in Java abrufen?

Ich weiß, dass es einen Weg gab, um es mit Apache Commons zu bekommen, wie hier dokumentiert: 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-Get-Anfrage in Java zu machen und den Antworttext als String und nicht als Stream zu erhalten?

   

Jede Bibliothek, an die ich denken kann, gibt einen Stream zurück. Sie können IOUtils.toString() von Apache Commons IO verwenden , um in einem Methodenaufruf einen InputStream in einen String 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 Inhaltscodierung aus der Antwort zu verwenden, falls verfügbar. Andernfalls wird UTF-8 standardmäßig als beste Schätzung verwendet, anstatt den lokalen Systemstandard zu verwenden.

Hier sind zwei Beispiele aus meinem Arbeitsprojekt.

  1. Verwenden von 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. Verwenden von BasicResponseHandler

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

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

 String response = new String(); List nameValuePairs = new ArrayList(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 aufzunehmen. sehr einfach.

Dies ist im konkreten Fall relativ einfach, im allgemeinen aber recht schwierig.

 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 HTTP-Antwortheader Content-Type .

Dieser Header enthält Informationen über die Nutzdaten und kann die Codierung von Textdaten definieren. Selbst wenn Sie Textarten annehmen, müssen Sie möglicherweise den Inhalt selbst überprüfen, um die korrekte Zeichencodierung zu bestimmen. Siehe zB die HTML 4-Spezifikation für Details dazu, wie man das für das bestimmte Format macht.

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

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

Wie wäre es damit?

 org.apache.commons.io.IOUtils.toString(new URL("http://www.someurl.com/")); 

Die Antwort von McDowell ist richtig. Allerdings, wenn Sie einen anderen Vorschlag in einigen der obigen Beiträge versuchen.

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

Dann gibt es Ihnen illegalStateException, dass der Inhalt bereits verbraucht ist.

Im Folgenden finden Sie eine einfache Möglichkeit zum Zugreifen auf die Antwort als String mithilfe der Apache HTTP Client-Bibliothek.

 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 responseHandler = new BasicResponseHandler(); String responseBody = httpClient.execute(get, responseHandler); 

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

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

Hier ist ein leichter Weg, dies zu tun:

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

Mit natürlich responseString , der Antwort und Antwort der HttpResponse , die von HttpClient.execute(request)