【问题标题】:sending post data to https without ssl cert verification with apache httpClient client使用 apache httpClient 客户端在没有 ssl 证书验证的情况下将发布数据发送到 https
【发布时间】:2013-01-11 17:56:42
【问题描述】:

我需要使用 apache HttpClient 包将帖子数据发送到 https url,

发送帖子数据后,我需要检索 html 数据。

我发送的帖子数据是一个 XML 字符串,而我接收的帖子数据是一个 XML 字符串。

任何有关该问题的信息将不胜感激。

我用谷歌搜索并在互联网上找到了使用 DefaultHttpClient 的示例,现在版本 4 中已弃用。所以想知道如何正确使用新版客户端。

谢谢。

更新

public String sendPost(final String request, final String postData) throws ClientProtocolException, IOException  {
    String result = null;
    CloseableHttpClient httpclient = HttpClients.createDefault();
    HttpPost httpPost = new HttpPost(request);
    CloseableHttpResponse response = httpclient.execute(httpPost);
    try {
        HttpEntity entity = response.getEntity();
        result = EntityUtils.toString(entity);
        EntityUtils.consume(entity);
    } finally {
        response.close();
    }
    return result;

}

到目前为止,我想出了这个发送请求并从响应中检索字符串的函数。我认为它应该工作。我缺少的是我对 postData 没有做任何事情。如何在我的请求中发送帖子数据?

【问题讨论】:

  • 为什么您不想使用套接字编写一个简单的 telnet 客户端?
  • 因为将来我需要验证 ssl 证书

标签: java apache-httpclient-4.x


【解决方案1】:
public String sendPost(final String request, final String postData) throws ClientProtocolException, IOException, NoSuchAlgorithmException, KeyManagementException  {
    String result = null;
    SSLContext sslContext = SSLContext.getInstance("SSL");

    // set up a TrustManager that trusts everything
    sslContext.init(null, new TrustManager[] { new X509TrustManager() {
                public X509Certificate[] getAcceptedIssuers() {
                        System.out.println("getAcceptedIssuers =============");
                        return null;
                }

                public void checkClientTrusted(X509Certificate[] certs,
                                String authType) {
                        System.out.println("checkClientTrusted =============");
                }

                public void checkServerTrusted(X509Certificate[] certs,
                                String authType) {
                        System.out.println("checkServerTrusted =============");
                }
    } }, new SecureRandom());

    CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(new SSLSocketFactory(sslContext)).build();
    HttpPost httpPost = new HttpPost(request);
    ByteArrayEntity postDataEntity = new ByteArrayEntity(postData.getBytes());
    httpPost.setEntity(postDataEntity);
    CloseableHttpResponse response = httpclient.execute(httpPost);
    try {
        HttpEntity entity = response.getEntity();
        result = EntityUtils.toString(entity);
        EntityUtils.consume(entity);
    } finally {
        response.close();
    }
    return result;

}

【讨论】:

  • SSLSocketFactory 现已折旧!
  • @joker 我们应该改用什么?
  • @EliHalych,很遗憾,我不确定。
【解决方案2】:

这是另一种使用 Apache 4.5 的方法:

/////////////////
// Create SSL Client
/////////////////

CloseableHttpClient httpclient = null;
HttpHost target = new HttpHost('www.mysite.com', 443, "https");

SSLContext sslcontext = SSLContexts.createSystemDefault();
SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(
        sslcontext, new String[] { "TLSv1", "SSLv3" }, null,
        SSLConnectionSocketFactory.getDefaultHostnameVerifier());

Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
        .register("http", PlainConnectionSocketFactory.INSTANCE)
        .register("https", sslConnectionSocketFactory)
        .build();
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(socketFactoryRegistry);

httpclient = HttpClients.custom()
.setSSLSocketFactory(sslConnectionSocketFactory)
.setConnectionManager(cm)
.build();

/////////////////
// Send POST
/////////////////

HttpPost httppost = new HttpPost('/mypath');
ByteArrayEntity postDataEntity = new ByteArrayEntity(postData.getBytes());
httpPost.setEntity(postDataEntity);
CloseableHttpResponse response = httpclient.execute(target, httpPost);

/////////////////
// Get RESPONSE
/////////////////

try {
        HttpEntity entity = response.getEntity();
        result = EntityUtils.toString(entity);
        EntityUtils.consume(entity);
} finally {
        response.close();
}

【讨论】:

  • 如果提供到所需 jars/依赖项的链接会更好
猜你喜欢
  • 1970-01-01
  • 2016-10-11
  • 2012-11-10
  • 2014-04-07
  • 2014-02-08
  • 2012-03-15
  • 1970-01-01
  • 2012-06-07
  • 1970-01-01
相关资源
最近更新 更多