2015-04-23 87 views
0

我有一個android應用程序發送一個http請求到服務器,並從它接收響應。直到今天,我請求發送到服務器以這樣的方式從https網站發送和接收數據

DefaultHttpClient httpClient = new DefaultHttpClient(); 
HttpPost httpPost = new HttpPost(http_url); 
httpPost.setEntity(new UrlEncodedFormEntity(params)); 

HttpResponse httpResponse = httpClient.execute(httpPost); 
HttpEntity httpEntity = httpResponse.getEntity(); 
InputStream is = httpEntity.getContent(); 

其中HTTP_URL包含HTTP URL(http://www.mydomain.it/script.php)腳本我需要調用。 現在我已經購買並在我的服務器上安裝了SSL證書,因此我需要開始將它用於crypt數據。

我已經使用相同的代碼發送和接收數據,而不是http_url我使用了https_url(https://www.mydomain.it/script.php)。 隨着wireshark我已經注意到數據包被加密,但我會知道如果這是發送https請求的正確方法。 DefaultHttpClient是否提供給所有啓動加密通信的操作,或者還有其他的Java類可以做到這一點?

回答

0

使用此方法用於HTTPS請求獲得的HttpClient:

public DefaultHttpClient getNewHttpClient() { 
    try { 
     KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); 
     trustStore.load(null, null); 

     SSLSocketFactory sf = new MySSLSocketFactory(trustStore); 
     sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); 

     HttpParams params = new BasicHttpParams(); 
     HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); 
     HttpProtocolParams.setContentCharset(params, HTTP.UTF_8); 

     SchemeRegistry registry = new SchemeRegistry(); 
     registry.register(new Scheme("https", sf, 443)); 

     ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry); 

     return new DefaultHttpClient(ccm, params); 
    } catch (Exception e) { 
     return new DefaultHttpClient(); 
    } 
} 
+0

確定,但有什麼用你的方法,而不是我的優勢? – giozh

+0

它會創建一個更安全的服務器連接。只需用getNewHttpClient()替換第一行中的新DefaultHttpClient()即可。 –

+0

我應該使用org.apache包或javax.net的SSLSocketFactory嗎? – giozh