HttpsURLConnection用于休息服务调用

时间:2015-11-24 06:09:54

标签: httpsurlconnection

我正在使用HttpsURLConnection调用POST方法,我无法在调用中添加请求有效负载。当我从soapui工具手动执行时,相同的请求工作。有谁知道如何做到这一点?

以下是我正在使用的java代码:

// 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();

1 个答案:

答案 0 :(得分: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());

请注意,您可能在生产中使用此代码,因为它接受任何网站作为安全。在生产中,您应该将程序配置为仅接受可信证书。

相关问题