2011-06-30 16 views
0

我在我的android應用程序中嘗試了很多使用HTTPS的方法。其實我在這裏的工作是想從服務器做一個api調用,並希望獲得authourisation。在Android中執行HTTPS

HostnameVerifier hostnameVerifier = org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER; 

      DefaultHttpClient client = new DefaultHttpClient(); 

      SchemeRegistry registry = new SchemeRegistry(); 
      SSLSocketFactory socketFactory = SSLSocketFactory.getSocketFactory(); 
      socketFactory.setHostnameVerifier((X509HostnameVerifier) hostnameVerifier); 
      registry.register(new Scheme("https", socketFactory, 443)); 
      SingleClientConnManager mgr = new SingleClientConnManager(client.getParams(), registry); 
      DefaultHttpClient httpClient = new DefaultHttpClient(mgr, client.getParams()); 

      // Set verifier  
      HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier); 

      // Example send http request 
      final String url = "https://(serveraddress).../"; 
      HttpPost httpPost = new HttpPost(url+ zAPIName); 


      byte[] byteArray = (zUserNameP.trim() + ":" + zPasswordP.trim()).getBytes(); 
      String EncodedString = Base64.encodeBytes(byteArray); 
      httpPost.setHeader("Authorization", "Basic " + EncodedString); 

      httpPost.setEntity(zStringEntityL); 
      HttpResponse aHttpResponseL; 
      aHttpResponseL = client.execute(httpPost); 
      BufferedReader aBufferedReaderL = new BufferedReader(new InputStreamReader(
        aHttpResponseL.getEntity().getContent())); 
      StringBuffer aStringBufferL = new StringBuffer(""); 
      String zLineL = ""; 
      String zLineSeparatorL = System.getProperty("line.separator"); 
      while ((zLineL = aBufferedReaderL.readLine()) != null) { 
       aStringBufferL.append(zLineL + zLineSeparatorL); 
      } 
      aBufferedReaderL.close(); 
      zResponserResultL = aStringBufferL.toString(); 
      aResultL.StatusCode = aHttpResponseL.getStatusLine().getStatusCode(); 
      ResposeMessage aMessageL = new ResposeMessage(); 
      Gson gson = new Gson(); 
      aMessageL = gson.fromJson(zResponserResultL, ResposeMessage.class); 
      aResultL.ResponseString = aMessageL.message;  

在上面的代碼,如果我使用(HTTP) 「HTTP://(serveraddress)...... /」 其工作正常,但其不工作的(HTTPS)「https://開頭(serveraddress) ...... /」。我嘗試了我們網站上提供的所有解決方案。但沒有解決。請幫助我。

+0

服務器確實*支持* HTTPS嗎?如果是這樣,那麼「不工作」是什麼意思?它會給出錯誤嗎?如果是這樣,請發佈完整的錯誤。 –

+0

是的我的服務器支持HTTPs,並且我得到「null」的錯誤。 –

+0

'null'不是錯誤,它是一個返回碼。檢查你的logcat,看看你是否得到任何錯誤。如果是這樣,請編輯您的問題以包含它們。 –

回答

0

這看起來很複雜......我有一個小得多的解決方案。我從來沒有在https上試過它,但我認爲這也會起作用。

只需設置憑據的HTTP客戶端:

httpClient = new DefaultHttpClient(); 
String user = prefs.getString("http_auth_username", ""); 
String pwd = prefs.getString("http_auth_password", ""); 
httpClient.getCredentialsProvider().setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(user, pwd)); 

那麼您不必手動設置身份驗證頭。