2011-04-24 49 views
108

我知道曾經有一種方法使用Apache公地把它作爲記錄在這裏: http://hc.apache.org/httpclient-legacy/apidocs/org/apache/commons/httpclient/HttpMethod.html 這裏一個例子:如何在Java中將HTTP響應主體作爲字符串獲取?

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

,但我相信這是不推薦使用。 是否有任何其他方式來在java中獲取http請求並獲取響應正文作爲字符串而不是流?

+1

由於這個問題和所有的答案似乎是關於Apache庫,這應該被標記爲這樣。沒有使用第三方庫,我什麼都看不到。 – eis 2016-06-21 15:19:34

回答

76

我能想到的每個庫都會返回一個流。您可以使用Apache Commons IO中的IOUtils.toString()在一個方法調用中將InputStream讀入String。例如爲:

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

更新:我改變上面的例子中使用的內容的編碼從如果可用的響應。否則,它將默認爲UTF-8作爲最佳猜測,而不是使用本地系統默認值。

+3

這會在很多情況下破壞文本,因爲該方法使用的系統默認文本編碼根據操作系統和用戶設置而異。 – McDowell 2011-04-24 10:20:23

+0

@McDowell:oops謝謝,我將javadoc與編碼鏈接在一起,但我忘記在示例中使用它。我現在在示例中添加了UTF-8,儘管技術上應該使用響應中的Content-Encoding標頭(如果可用)。 – WhiteFang34 2011-04-24 10:30:11

+0

IOUtils的大量用法。很好的實踐方法。 – Spidey 2011-06-02 05:50:20

27

這在具體情況下相對簡單,但在一般情況下相當棘手。

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

的答案取決於Content-TypeHTTP response header

此標題包含有關有效負載的信息,可能定義文本數據的編碼。即使您假定text types,您可能需要檢查內容本身以確定正確的字符編碼。 例如請參閱HTML 4 spec以瞭解有關如何爲特定格式執行此操作的詳細信息。

一旦編碼已知,可以使用InputStreamReader來解碼數據。

這個答案取決於服務器做的是正確的事情 - 如果你想處理響應標題與文檔不匹配或者文檔聲明與所用編碼不匹配的情況,那就是另一個魚的水壺。

44

這裏是從另一個簡單的項目,我正在使用HttpClient庫來自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); 
} 

只是用EntityUtils搶響應主體爲一個字符串。很簡單。

+1

甜!!!謝謝!!! – NOlivNeto 2014-09-26 17:55:17

8

這個怎麼樣?

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

以下是我的工作項目中的兩個示例。

  1. 使用EntityUtilsHttpEntity

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

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

我遇到的方法1唯一的問題是,當您執行'response.getEntity()'時,實體對象被消耗,現在它可用作'responseString'。如果您嘗試再次執行response.getEntity(),它將返回'IllegalStateException'。 – Tirtha 2013-07-24 06:42:47

+0

在我的情況下工作 - 從CloseableHttpClient響應獲取正文。 – 2016-10-17 10:53:55

+0

什麼是httpClient? – 2017-07-04 11:48:33

6

答案是正確的。但是,如果您在上述幾篇帖子中嘗試其他建議。

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

然後,它會給你illegalStateException指出內容已被使用。

4

下面是使用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); 
1

我們可以使用下面的代碼也獲得Java中的HTML響應

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

    } 
} 
+0

這是一個非常好的響應,這是我需要顯示的內容,將數據發佈到服務器後的響應。做得好。 – SlimenTN 2018-01-01 09:54:12

0

這裏是這樣做的一個輕量級的方式:

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

隨着當然responseString包含網站的響應和響應類型爲HttpResponse,由HttpClient.execute(request)返回

相關問題