2012-12-27 222 views
6

這是我的HTTP JSON發送HTTPS POST請求到服務器

{ 
"User": {  
    "Name": "Compulsary","Password": "Compulsary" } 
} 

這我倒張貼到使用HTTPS POST請求的服務器。 當我嘗試發送請求時,我收到SSL服務器證書異常。 我該如何解決這個問題?

我試過了什麼?

我試過使用HTTPPostHTTPClient。 SSL例外。 我也試過使用URLConnection並忽略了對SSL證書的檢查。 我得到401和405響應代碼。

的問題陳述:

發送上述POST請求發送到服務器(該請求是安全的接受HTTPS)。 如何在android中實現這個?

我試過這個,我的代碼,我得到405錯誤?

// always verify the host - dont check for certificate 
final static HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier() { 
    public boolean verify(String hostname, SSLSession session) { 
     return true; 
    } 
}; 

/** 
* Trust every server - dont check for any certificate 
*/ 
private static void trustAllHosts() { 
    // Create a trust manager that does not validate certificate chains 
    TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() { 
     public java.security.cert.X509Certificate[] getAcceptedIssuers() { 
      return new java.security.cert.X509Certificate[] {}; 
     } 

     public void checkClientTrusted(X509Certificate[] chain, 
       String authType) throws CertificateException { 
     } 

     public void checkServerTrusted(X509Certificate[] chain, 
       String authType) throws CertificateException { 
     } 
    } }; 

    // Install the all-trusting trust manager 
    try { 
     SSLContext sc = SSLContext.getInstance("TLS"); 
     sc.init(null, trustAllCerts, new java.security.SecureRandom()); 
     HttpsURLConnection 
       .setDefaultSSLSocketFactory(sc.getSocketFactory()); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

private void makeRequest() { 
    URL url = null; 
    HttpsURLConnection urlConnection = null; 
    try { 
     url = new URL("https://wbapi.cloudapp.net:443/api/User/LocalLogin"); 
    } catch (MalformedURLException e2) { 
     // TODO Auto-generated catch block 
     e2.printStackTrace(); 
    } 
    StringBuilder sb = new StringBuilder(); 

    try { 
     trustAllHosts(); 
     urlConnection = (HttpsURLConnection) url.openConnection(); 
     urlConnection.setHostnameVerifier(DO_NOT_VERIFY); 
     urlConnection.setDoOutput(true); 
     urlConnection 
       .setRequestProperty("Content-Type", "application/json"); 
     urlConnection.setFixedLengthStreamingMode(urlConnection 
       .getContentLength()); 
    } catch (IOException e2) { 
     // TODO Auto-generated catch block 
     e2.printStackTrace(); 
    } 

    try { 
     urlConnection.connect(); 
    } catch (IOException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 
    JSONObject jsonParam = new JSONObject(); 
    try { 
     jsonParam.put("Name", "dog"); 
     jsonParam.put("Password", "123"); 
     Log.v("Length", "" + urlConnection.getContentLength()); 
     int HttpResult = urlConnection.getResponseCode(); 
     Toast.makeText(LoginActivity.this, "Response" + HttpResult, 
       Toast.LENGTH_LONG).show(); 
     if (HttpResult == HttpsURLConnection.HTTP_OK) { 
      System.out.println("ok"); 
      Log.v("Hi", "" + "Trex"); 
      BufferedReader br = new BufferedReader(new InputStreamReader(
        urlConnection.getInputStream(), "utf-8")); 
      String line = null; 
      while ((line = br.readLine()) != null) { 
       sb.append(line + "\n"); 
      } 
      br.close(); 

      System.out.println("" + sb.toString()); 
      Toast.makeText(LoginActivity.this, "" + sb.toString(), 
        Toast.LENGTH_LONG).show(); 

     } else { 
      System.out.println("Here" + urlConnection.getResponseMessage()); 
     } 
    } catch (MalformedURLException e) { 

     e.printStackTrace(); 
    } catch (IOException e) { 

     e.printStackTrace(); 
    } catch (JSONException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

logcat的條目

12-27 13:41:27.228: V/Length(3034): 72 
12-27 13:41:27.248: I/System.out(3034): HereMethod Not Allowed 
+0

你應該嘗試看看這裏:http://stackoverflow.com/questions/4461360/how-to-install-trusted-ca-certificate-on-android-device但這並不適用於所有情況。 – neworld

+1

我環顧了很多的stackoverflow問題,沒有幫助 –

+0

你需要嘗試,如果沒有真正幫助你喊解釋你的問題的更多細節,並應顯示你的代碼 – neworld

回答

10

步驟1:創建類MySSLSocketFactory和包括以下碼:

public class MySSLSocketFactory extends SSLSocketFactory { 
    SSLContext sslContext = SSLContext.getInstance("TLS"); 

    public MySSLSocketFactory(KeyStore truststore) 
        throws NoSuchAlgorithmException, KeyManagementException, 
        KeyStoreException, UnrecoverableKeyException { 
      super(truststore); 

      TrustManager tm = new X509TrustManager() { 
        public void checkClientTrusted(X509Certificate[] chain, 
            String authType) throws CertificateException { 
        } 

        public void checkServerTrusted(X509Certificate[] chain, 
            String authType) throws CertificateException { 
        } 

        public X509Certificate[] getAcceptedIssuers() { 
          return null; 
        } 
      }; 

      sslContext.init(null, new TrustManager[] { tm }, null); 
    } 

    @Override 
    public Socket createSocket(Socket socket, String host, int port, 
        boolean autoClose) throws IOException, UnknownHostException { 
      return sslContext.getSocketFactory().createSocket(socket, host, port, 
          autoClose); 
    } 

    @Override 
    public Socket createSocket() throws IOException { 
      return sslContext.getSocketFactory().createSocket(); 
    } 

} 

步驟2:創建類WebClientDevWrapper幷包括以下代碼:

public class WebClientDevWrapper { 

    public static HttpClient 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("http", PlainSocketFactory.getSocketFactory(), 80)); 
      registry.register(new Scheme("https", sf, 443)); 

      ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry); 

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

} 

步驟3 :在您的活動或其他地方創建一個方法,這個方法將用於進行網絡調用。

/** 
    * Request JSON based web service to get response 
    * 
    * @param url 
    *   - base URL 
    * @param request 
    *   - JSON request 
    * @return response 
    * @throws ClientProtocolException 
    * @throws IOException 
    * @throws IllegalStateException 
    * @throws JSONException 
    */ 
    public HttpResponse request(String url, JSONObject request) 
      throws ClientProtocolException, IOException, IllegalStateException, 
      JSONException { 

     DefaultHttpClient client = (DefaultHttpClient) WebClientDevWrapper.getNewHttpClient(); 

      HttpPost post = new HttpPost(url); 
      post.setEntity(new StringEntity(request.toString(), "utf-8")); 
      HttpResponse response = client.execute(post); 
      return response; 
     } 
    } 

步驟4:呼叫的方法,並獲得響應。

+0

什麼是MySSLSocketFactory? –

+0

@RajeevNB哎呀,我忘記了,包括在步驟1。檢查 –

+0

JSONObject對象= new JSONObject(); \t \t嘗試{ \t \t \t object.put(「Name」,「dog」); \t \t \t object.put(「Password」,「123」); \t \t}趕上(JSONException E){ \t \t \t // TODO自動生成的catch程序塊 \t \t \t e.printStackTrace(); \t \t} JSON我需要上面的JSON對象?這是對的嗎 ? –

0

我用下面的代碼HTTPS/HTTP/wift/3G的結合,希望它有助於

public class CustomHttpClient { 
private static DefaultHttpClient customHttpClient; 

/** A private Constructor prevents instantiation */ 
private CustomHttpClient() { 
} 

public static synchronized DefaultHttpClient getHttpClient() { 
    if (customHttpClient == null) { 
     HttpParams params = new BasicHttpParams(); 
     HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); 
     HttpProtocolParams.setContentCharset(params, 
       HTTP.DEFAULT_CONTENT_CHARSET); 
     HttpProtocolParams.setUseExpectContinue(params, true); 
     HttpProtocolParams.setUserAgent(params, "Mozilla/5.0 (Linux; U; Android 2.2.1; en-us; Nexus One Build/FRG83) AppleWebKit/533.1(KHTML, like Gecko) Version/4.0 Mobile Safari/533.1"); 
     ConnManagerParams.setTimeout(params, 1000); 
     HttpConnectionParams.setConnectionTimeout(params, 5000); 
     HttpConnectionParams.setSoTimeout(params, 10000); 
     SchemeRegistry schReg = new SchemeRegistry(); 
     schReg.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); 
     schReg.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443)); 
     ClientConnectionManager conMgr = new ThreadSafeClientConnManager(params,schReg); 
     customHttpClient = new DefaultHttpClient(conMgr, params); 
    } 
    return customHttpClient; 
} 

public Object clone() throws CloneNotSupportedException { 
    throw new CloneNotSupportedException(); 
} 

}

和樣品

public static String Call(String URL, List<NameValuePair> postParameters) 
{ 
    BufferedReader in = null; 
    DefaultHttpClient httpClient; 
    StringBuffer sb = new StringBuffer(); 
    try{ 
     httpClient = CustomHttpClient.getHttpClient(); 

     HttpProtocolParams.setUseExpectContinue(httpClient.getParams(), false); //making 3G network works* 
     HttpPost request = new HttpPost(URL); 
     UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(postParameters); 
     request.setEntity(formEntity); 
     HttpResponse response = httpClient.execute(request); 
     in = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); 
     String line = ""; 
     String NL = System.getProperty("line.separator"); 
     while ((line = in.readLine()) != null) { 
     sb.append(line + NL); 
     } 
     in.close(); 

    }catch(Exception ex) 
    { 
     ex.printStackTrace(); 

    } 
    return sb.toString(); 
} 
相關問題