2012-09-14 32 views
0

這裏請對HTTPS服務器的請求,是我的代碼,以使一個POST請求的HTTP服務器上的servlet擊中一個servlet

private static void post(String endpoint, Map<String, String> params) 
     throws IOException { 
    URL url; 
    try { 
     url = new URL(endpoint); 
    } catch (MalformedURLException e) { 
     throw new IllegalArgumentException("invalid url: " + endpoint); 
    } 
    StringBuilder bodyBuilder = new StringBuilder(); 
    Iterator<Entry<String, String>> iterator = params.entrySet().iterator(); 
    // constructs the POST body using the parameters 
    while (iterator.hasNext()) { 
     Entry<String, String> param = iterator.next(); 
     bodyBuilder.append(param.getKey()).append('=') 
       .append(param.getValue()); 
     if (iterator.hasNext()) { 
      bodyBuilder.append('&'); 
     } 
    } 
    String body = bodyBuilder.toString(); 
    Log.v(TAG, "Posting '" + body + "' to " + url); 
    byte[] bytes = body.getBytes(); 
    HttpURLConnection conn = null; 


    try { 
     conn = (HttpURLConnection) url.openConnection(); 
     conn.setDoOutput(true); 
     conn.setUseCaches(false); 
     conn.setFixedLengthStreamingMode(bytes.length); 
     conn.setRequestMethod("POST"); 
     conn.setRequestProperty("Content-Type", 
       "application/x-www-form-urlencoded;charset=UTF-8"); 
     // post the request 
     OutputStream out = conn.getOutputStream(); 
     out.write(bytes); 
     out.close(); 
     // handle the response 
     int status = conn.getResponseCode(); 
     if (status != 200) { 
      throw new IOException("Post failed with error code " + status); 
     } 
    } finally { 
     if (conn != null) { 
      conn.disconnect(); 
     } 
    } 
    } 

當我的終點是像HTTP:// myipaddress: MyPort上/它運作良好,但是當我已經改變了它它不工作的HTTPS連接我看了一下HttpsURLConnection太多,但我沒有得到如何實現它那裏,他們寫了這以下代碼:

KeyStore keyStore = ...; 
    TrustManagerFactory tmf = TrustManagerFactory.getInstance("X509"); 
    tmf.init(keyStore); 

    SSLContext context = SSLContext.getInstance("TLS"); 
    context.init(null, tmf.getTrustManagers(), null); 

    URL url = new URL("https://www.example.com/"); 
    HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection(); 
    urlConnection.setSSLSocketFactory(context.getSocketFactory()); 
    InputStream in = urlConnection.getInputStream(); 

但我不能得到什麼應該在Keystore我只有文件文件,如果我使用Keystore.getInstance(String類型)如何獲取證書的類型。

請幫幫我。

回答

0

請檢查此作出POST請求,以確保服務器

//請求

String Verify_Mobile_URL ="https://www.sample.php"; 
         try 
         { 

          StringBuilder postDataBuilder = new StringBuilder(); 
          postDataBuilder.append("param1").append("=").append("paramvalue"); 
          postDataBuilder.append("&").append("param2").append("=").append("paramvalue"); 


          byte[] postData = postDataBuilder.toString().getBytes(); 

          // Hit the dm URL. 

          URL url = new URL(Verify_Mobile_URL); 
          HttpsURLConnection.setDefaultHostnameVerifier(new AllVerifier()); 
          SSLContext sslContext = SSLContext.getInstance("TLS"); 
          sslContext.init(null, new TrustManager[] { new AllTrustManager() }, null); 
          HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory()); 
          HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();   
          conn.setReadTimeout(60000); 
          conn.setConnectTimeout(35000); 
          conn.setDoOutput(true); 
          conn.setUseCaches(false); 
          conn.setRequestMethod("POST"); 
          conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
          conn.setRequestProperty("Content-Length",Integer.toString(postData.length)); 

          OutputStream out = conn.getOutputStream(); 
          out.write(postData); 
          out.close(); 

          int responseCode = conn.getResponseCode(); 
          if(responseCode==200) 
          { 
           InputStream inputstream=conn.getInputStream(); 
           String result=streamToString(inputstream); // here you will will get result from 

          } 
          catch(Exception e) 
          { 
          } 







/** 
    * This method convert inputstream to string 
    * @param is - inputtream to be converted 
    * @return String - converted string 
    */ 
    public static String streamToString(InputStream is) 
    { 
     DataInputStream din = new DataInputStream(is); 
     StringBuffer sb = new StringBuffer(); 
     try { 
      String line = null; 
      while ((line = din.readLine()) != null) 
      { 
       sb.append(line + "\n"); 
      } 

     } 
     catch (Exception ex) 
     {}  

     finally 
     { 
      try 
      { if(is!=null) 
       { 
        din.close(); 
        is.close(); 
       } 
      } 
      catch (Exception ex) 
      {} 

     } 
     return sb.toString(); 

    } 
















public class AllTrustManager implements X509TrustManager { 

    @Override 
    public void checkClientTrusted(X509Certificate[] chain, String authType) 
      throws CertificateException { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void checkServerTrusted(X509Certificate[] chain, String authType) 
      throws CertificateException { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public X509Certificate[] getAcceptedIssuers() { 
     // TODO Auto-generated method stub 
     return new X509Certificate[0]; 
    } 

} 





public class AllVerifier implements HostnameVerifier { 

    @Override 
    public boolean verify(String hostname, SSLSession session) { 
     // TODO Auto-generated method stub 
     return true; 
    } 

} 
+0

新AllVerifier()不工作 – pyus13

+0

是什麼問題...,我已經使用相同的代碼,沒有issue ... – Shiva

+0

其實我已經將它們定義爲內部類,所以它現在給出了一個錯誤我做了什麼,我已經通過直接使用新的HostnameVerifier和新的X509TrustManager及其工作良好感謝很多重寫了方法。 – pyus13

相關問題