2012-03-13 72 views
0

我希望通過這個問題來解決我的長期問題,並希望你們幫助,但首先;我一直有問題連接到HTTPS自簽名證書服務器近3周。儘管這裏有多種解決方案,但我似乎無法解決我的問題。可能我不知道如何正確使用它,或者沒有一些文件或導入正確的庫。如何使用命令:HttpEntity?

我遇到了一些需要我從https連接到的網站下載證書的網站,以及當我這樣做的時候。在我可以使用我創建的證書或密鑰庫之前,我必須執行一些步驟。我從這個網站此解決方案:

Android: Trusting SSL certificates

// Instantiate the custom HttpClient 
DefaultHttpClient client = new MyHttpClient(getApplicationContext()); 
HttpGet get = new HttpGet("https://www.mydomain.ch/rest/contacts/23"); 
// Execute the GET call and obtain the response 
HttpResponse getResponse = client.execute(get); 
HttpEntity responseEntity = getResponse.getEntity(); 

我有一個問題,最後一行之後,如上所述。我如何處理responseEntity?如果我希望在WebView上顯示https網站,我該如何使用它?一些幫助和解釋將是很好:)

回答

4

全部內容如果您希望HttpEntity的內容正確方式不包括包括調用HttpEntity#getContent()來檢索一個數據流,並在Android SDK中使用大量無意義的東西。

試試這個。

// Execute the GET call and obtain the response 
HttpResponse getResponse = client.execute(get); 
HttpEntity responseEntity = getResponse.getEntity(); 

// Retrieve a String from the response entity 
String content = EntityUtils.toString(responseEntity); 

// Now content will contain whatever the server responded with and you 
// can pass it to your WebView using #loadDataWithBaseURL 

考慮顯示content在使用WebView#loadDataWithBaseURL - 它的表現要好很多。

+0

噢,我是盲人。我沒有看到這個答案。無論如何,我正在結束我的工作,並會在我回家時嘗試。請檢查這個網站,因爲我肯定會回覆,如果它的工作或沒有! – 2012-03-13 10:03:17

+0

我設法運行應用程序沒有任何運行時錯誤,但我沒有得到任何輸出。經過一番繁瑣的調試。 getResponse = client.execute(get)返回一個空值。我明白爲什麼我可能會得到空回報。您提供的代碼要求我使用try-catch方法。結果將如下所示:'嘗試getResponse = client.execute(get); \t \t \t HttpEntity responseEntity = getResponse.getEntity(); \t \t \t content = EntityUtils.toString(responseEntity); (ClientProtocolException e){ \t \t \t e.printStackTrace(); \t \t} catch(IOException e){\t \t \t e.printStackTrace(); \t \t}' – 2012-03-14 04:13:02

+0

嗨,我做這個應用程序已經有一段時間了。我試過你的'String content = EntityUtils.toString(responseEntity);'工作得很好,但它有點返回一個HTML代碼而不是URL鏈接。我做錯什麼了嗎? – 2012-03-19 06:58:09

0

您需要撥打responseEntity.getContent()獲得響應InputStream根據您請求的URL。以您想要的方式使用該流來呈現數據。例如,如果預期的數據字符串,所以你可以在此流簡單地轉換成字符串與下面的方法:

/** 
* Converts InputStream to String and closes the stream afterwards 
* @param is Stream which needs to be converted to string 
* @return String value out form stream or NULL if stream is null or invalid. 
* Finally the stream is closed too. 
*/ 
public static String streamToString(InputStream is) { 
    try { 
     StringBuilder sb = new StringBuilder(); 
     BufferedReader tmp = new BufferedReader(new InputStreamReader(is),65728); 
     String line = null; 

     while ((line = tmp.readLine()) != null) { 
      sb.append(line); 
     } 

     //close stream 
     is.close(); 

     return sb.toString(); 
    } 
    catch (IOException e) { e.printStackTrace(); } 
    catch (Exception e) { e.printStackTrace(); } 

    return null; 
} 
+0

你的回答和raju的回答有什麼區別?對於這一行:'(新的InputStreamReader(是,「iso-8859-1」),8)'和'(新的InputStreamReader(is),65728)' – 2012-03-13 07:45:43

+0

他只是將字符編碼設置爲** ASCII **。但是,在我的回答中,我依賴於字符串的默認編碼,它是** UTF-8 **。默認情況下,所有Json和XML流都以UTF-8編碼。所以我想它是合理的嘗試默認的第一個,如果它沒有按預期工作,然後移動到任何其他編碼。或者檢查你的服務器以確認它使用哪種方案。關於緩衝區讀取長度爲8或65728,我只是簡單地將它設置爲更高的值,以便數據以更大的塊而不是小的讀取。所以它取決於你。 – waqaslam 2012-03-13 08:02:08

+0

我看到了,我對Raju的回答有問題。我如何實現你的代碼?在我輸入之後,我該如何使用它? – 2012-03-13 08:47:56

0
InputStream is = responseEntity.getContent(); 
try{ 
BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8); 
     StringBuilder sb = new StringBuilder(); 
     sb.append(reader.readLine() + "\n"); 
     String line="0"; 
     while ((line = reader.readLine()) != null) { 
         sb.append(line + "\n"); 
      } 

    String result=sb.toString(); 
      is.close(); 
}catch(Exception e){ 
       Log.e("log_tag", "Error converting result "+e.toString()); 
      } 

你將不得不在字符串「結果」

+0

感謝您的回覆,您介意說明「iso-8859-1」和「8」是什麼意思?或者如果我不放下它會發生什麼? – 2012-03-13 07:44:06

+0

我得到一個錯誤,說我需要使用try-catch異常。我該怎麼辦?我確實在我的主要活動中使用了你的方法,是否放錯了這個代碼? – 2012-03-13 07:59:01

+0

我編輯了代碼... – 5hssba 2012-03-13 08:01:17