Как решить java.net.SocketException: сброс соединения при отправке почтового запроса с использованием CloseableHttpClient? - PullRequest
0 голосов
/ 05 июня 2018

Я пытаюсь использовать веб-службу отдыха https, используя CloseableHttpClient и HttpPost в Java, но не могу это сделать.Я думаю, что это как-то связано с моим запросом, а также с ssl и протоколами TLS, но я действительно мало что знаю об этом.Я могу делать запросы от почтальона просто отлично.

Вот мой код:

public class RestHttpsPiloto {

//private static final String POST_URL = "https://www.google.com";  
private static final String POST_URL = "https://<URL>"; 

public static void httpsPilotoMail() throws ClientProtocolException, IOException, KeyManagementException, NoSuchAlgorithmException, KeyStoreException{
    CloseableHttpClient httpClient = HttpClientBuilder.create().build();
        //CloseableHttpClient httpClient=createAcceptSelfSignedCertificateClient();         
        HttpPost httpPost = new HttpPost(POST_URL);
        //HttpGet httpGet = new HttpGet(POST_URL);
        String payload = "data={" +
                "\"correo\": \"email\", " +
                "\"rut\": \"xxxxxxx-x\", " +
                "\"nombre\": \"nombre\", " +
                "\"idHtml\": \"21\", " +
                "\"token\": \"JAHNSMsamJ\"" +
                "}";
        StringEntity entity = new StringEntity(payload);
        httpPost.setEntity(entity);
        httpPost.setHeader("Accept", "application/json");
        httpPost.setHeader("Content-type", "application/json");
        //CloseableHttpResponse httpResponse = httpClient.execute(httpGet);
        CloseableHttpResponse httpResponse = httpClient.execute(httpPost);
        System.out.println("POST Response Status:: "
                + httpResponse.getStatusLine().getStatusCode());
        httpClient.close();

    } 



private static CloseableHttpClient createAcceptSelfSignedCertificateClient()
        throws KeyManagementException, NoSuchAlgorithmException, KeyStoreException {

    // use the TrustSelfSignedStrategy to allow Self Signed Certificates
    SSLContext sslContext = SSLContextBuilder
            .create()
            .loadTrustMaterial(new TrustSelfSignedStrategy())
            .build();

    /*SSLContext sslContext = SSLContexts.custom().useSSL().build();
    sslContext.init(null, new X509TrustManager[]{new HttpsTrustManager()}, new SecureRandom());
    SSLConnectionSocketFactory factory = new SSLConnectionSocketFactory(sslContext,
            SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);*/

    // create an SSL Socket Factory to use the SSLContext with the trust self signed certificate strategy
    SSLConnectionSocketFactory connectionFactory = new SSLConnectionSocketFactory(sslContext);
    //SSLConnectionSocketFactory connectionFactory = new SSLConnectionSocketFactory(sslContext, new String[] { "TLSv1.2"}, null, null);
    //System.setProperty("https.protocols", "SSLv3");

    // finally create the HttpClient using HttpClient factory methods and assign the ssl socket factory
    return HttpClients
            .custom()
            .setSSLSocketFactory(connectionFactory)
            .build();
}



public static void main(String[] args) throws ClientProtocolException, IOException, KeyManagementException, NoSuchAlgorithmException, KeyStoreException{
    httpsPilotoMail();

}

}

Я должен добавить, что создание closableHttpClient работает как для традиционного метода, так и для метода createAcceptSelfSignedCertificateClient ().Кроме того, с помощью этого кода я могу сделать запрос на получение https в Google.Я также хочу добавить, что я изменил URL в целях конфиденциальности ... поэтому я действительно надеюсь, что в моем коде есть что найти, потому что я знаю, что URL работает, и я не могу его опубликовать.

Вот моя трассировка стека:

Exception in thread "main" java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:168)
at com.sun.net.ssl.internal.ssl.InputRecord.readFully(InputRecord.java:422)
at com.sun.net.ssl.internal.ssl.InputRecord.read(InputRecord.java:460)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:863)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1188)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1215)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1199)
at org.apache.http.conn.ssl.SSLConnectionSocketFactory.createLayeredSocket(SSLConnectionSocketFactory.java:394)
at org.apache.http.conn.ssl.SSLConnectionSocketFactory.connectSocket(SSLConnectionSocketFactory.java:353)
at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:141)
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:353)
at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:380)
at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236)
at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184)
at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:88)
at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:107)
at com.vtr.pat.controller.RestHttpsPiloto.httpsPilotoMail(RestHttpsPiloto.java:56)
at com.vtr.pat.controller.RestHttpsPiloto.main(RestHttpsPiloto.java:94)

Большое спасибо в продвинутом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...