本篇内容介绍了“java怎么发送https请求”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
需要两个jar包,httpclient 和 httpcore。
PS:最好两个jar包的版本要一致,并且要保证本地没有同类名称的jar包,否则jar包冲突可可以会报”java.lang.NoClassDefFoundError:org/apache/http/impl/client/HttpClients “这种class找不到的错误!本人就遇到这种错误,最后把相同的jar包全删掉只保留一份(即便jar没有build path进去也要删掉)。
https协议比http安全性更高少量,具体原理如下:
用户端在用HTTPS方式与Web服务器通信时有以下几个步骤
(1)用户用https的URL访问Web服务器,要求与Web服务器建立SSL连接。
(2)Web服务器收到用户端请求后,会将网站的证书信息(证书中包含公钥)传送一份给用户端。
(3)用户端的浏览器与Web服务器开始协商SSL连接的安全等级,也就是信息加密的等级。
(4)用户端的浏览器根据双方同意的安全等级,建立会话密钥,而后利使用网站的公钥将会话密钥加密,并传送给网站。
(5)Web服务器利使用自己的私钥解密出会话密钥。
(6)Web服务器利使用会话密钥加密与用户端之间的通信。
因而需要安全证书,当然通过java代码方式能实现忽略证书的方式进行请求。
假如不在代码中添加忽略证书的特殊解决,一般会直接抛出如下异常报错:
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
即为提醒要发送证书才可以正常请求服务。
如下代码功可以就是忽略证书:
//https 请求忽略证书
SSLContextBuilder builder = new SSLContextBuilder();
builder.loadTrustMaterial(null, new TrustSelfSignedStrategy());
SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(builder.build(), NoopHostnameVerifier.INSTANCE);
Registry registry = RegistryBuilder.create()
.register("http", new PlainConnectionSocketFactory())
.register("https", sslConnectionSocketFactory)
.build();
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(registry);
cm.setMaxTotal(100);
CloseableHttpClient httpClient = HttpClients.custom()
.setSSLSocketFactory(sslConnectionSocketFactory)
.setConnectionManager(cm)
.build();
注意:上面的httpClient就是包装好的忽略证书的http请求实例对象,到时候直接使用这个对象发请求。
try {
//https 请求忽略证书
SSLContextBuilder builder = new SSLContextBuilder();
builder.loadTrustMaterial(null, new TrustSelfSignedStrategy());
SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(builder.build(), NoopHostnameVerifier.INSTANCE);
Registry registry = RegistryBuilder.create()
.register("http", new PlainConnectionSocketFactory())
.register("https", sslConnectionSocketFactory)
.build();
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(registry);
cm.setMaxTotal(100);
CloseableHttpClient httpClient = HttpClients.custom()
.setSSLSocketFactory(sslConnectionSocketFactory)
.setConnectionManager(cm)
.build();
//将使用户信息同步到第三方系统中
String url="https://xx.xx.xx.xx:1001/bomp/sync/execute";
//发送post请求
HttpPost method = new HttpPost(url);
//准备json数据发送参数
JSONObject paramIn = new JSONObject();
paramIn.put("app_id", "B39900002");
paramIn.put("secret_key", "ea703f2a02ae48b5b269ab43607275fe");
//构造内层json对象
JSONArray account_list = new JSONArray();
JSONObject account_list_obj = new JSONObject();
account_list_obj.put("account", pojo.get("loginId"));
account_list_obj.put("eip_account", "");
account_list_obj.put("name", pojo.get("loginName"));
account_list_obj.put("phone", pojo.get("mobile"));
account_list_obj.put("password", "");
account_list_obj.put("status", 1);
account_list_obj.put("roles", "");
account_list.add(account_list_obj);
paramIn.put("account_list", account_list);
//处理中文乱码问题
StringEntity entity = new StringEntity(paramIn.toString(),"utf-8");
entity.setContentEncoding("UTF-8");
entity.setContentType("application/json");
method.setEntity(entity);
//发送请求
HttpResponse result = httpClient.execute(method);
//请求结束,返回结果
String resData = EntityUtils.toString(result.getEntity());
System.out.println("RENWOXING result:"+resData);
//得到返回结果的j'son格式
JSONObject resJson = JSONObject.fromObject(resData);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (org.apache.http.ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch(Exception e){
e.printStackTrace();
}
“java怎么发送https请求”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。