2015-11-24 3 views
1

Я использую HttpsURLConnection для вызова метода POST, и я не могу добавить полезную нагрузку запроса к вызову. тот же запрос работает, когда я запускаю вручную из инструмента soapui. Кто-нибудь знает как это сделать?HttpsURLConnection для вызова службы отдыха

Вот код Явы я использую:

// Keystore 
    String jksFile = "/Users/......jks"; 
    String password = "password"; 

    System.setProperty("javax.net.ssl.keyStore", jksFile); 
    System.setProperty("javax.net.ssl.keyStorePassword", password); 

    String u = "https://example.com:443/private/loan-application"; 

    URL url = new URL(u); 

    String version = "3"; 

    HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); 
    conn.setDoOutput(true); 
    conn.setRequestMethod("POST"); 
    conn.setUseCaches(false); 
    conn.setConnectTimeout(10000); 
    conn.setReadTimeout(10000); 
    conn.setRequestProperty("Accept", "application/json;v=" + version); 
    conn.setRequestProperty("Api-Key", "XYZ"); 

    String jsonParamString = "{\"didNumber\":\"DI457\", \" .... "; 

    //Create JSONObject here 
    JSONObject jsonParam = new JSONObject(); 


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


    Map<String, List<String>> requestProperties = conn.getRequestProperties(); 
    displayHeaders(requestProperties); 

    OutputStream out = conn.getOutputStream(); 

    out.write(postData); 
    out.close(); 


    int respCode = conn.getResponseCode(); 


    System.out.println("Response headers:"); 
    displayHeaders(
      conn.getHeaderFields()); 

    InputStream is = null; 
    if (respCode == 200 || respCode == 203) { 
     is = conn.getInputStream(); 
    } 

    if (is == null) { 
     System.out.println("Using error stream"); 
     is = conn.getErrorStream(); 
    } 

    is.close(); 

ответ

0

Одно из возможных объяснений, почему ваш HttpsURLConnection вызов неудачу в том, что вы не настроили параметры SSL должным образом. В частности, домен example.com представляет сертификат, который не находится в вашем хранилище доверия, и поэтому ваша программа не работает во время установления связи SSL. Попробуйте добавить следующий код, который будет настроить программу доверять все сертификаты:

SSLContext sslContext = SSLContext.getInstance("TLS"); 
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); 
conn.setSSLSocketFactory(sslContext.getSocketFactory()); 

Обратите внимание, что вы должны, вероятно, не использовать этот код в производстве, так как он принимает любой сайт как безопасные. В процессе производства вы должны настроить свою программу только для приема доверенных сертификатов.

+0

Спасибо Тим за ответ. Я не думаю, что это из-за ошибки ssl. Я могу назвать метод GET, который отлично работает. Я получаю код состояния 200. – Namrata

+0

Вы пытались добавить свой код? Также, пожалуйста, покажите журнал ошибок в Tomcat. –