java发送https请求(post请求|JSON格式传参|忽略证书)

  • 时间:2018-06-20 22:28 作者:Inn程序媛 来源:Inn程序媛 阅读:1397
  • 扫一扫,手机访问
摘要:最近做项目遇到一个需求,需要在新添加使用户成功后把该使用户信息同步到第三方系统中。第三方系统提供了https接口服务地址,并且规定接收数据类型为JSON格式。拿到需求我就开始修改原有的新添加使用户接口,在新添加使用户成功后,添加代码发送请求给第三方系统同步使用户信息。下面将详细讲解步骤。后端发送ht

最近做项目遇到一个需求,需要在新添加使用户成功后把该使用户信息同步到第三方系统中。第三方系统提供了https接口服务地址,并且规定接收数据类型为JSON格式。

拿到需求我就开始修改原有的新添加使用户接口,在新添加使用户成功后,添加代码发送请求给第三方系统同步使用户信息。下面将详细讲解步骤。


后端发送http请求需要的代码环境

java发送https请求(post请求|JSON格式传参|忽略证书)

需要两个jar包,httpclient 和 httpcore。

PS:最好两个jar包的版本要一致,并且要保证本地没有同类名称的jar包,否则jar包冲突可可以会报”java.lang.NoClassDefFoundError:org/apache/http/impl/client/HttpClients “这种class找不到的错误!本人就遇到这种错误,最后把相同的jar包全删掉只保留一份(即便jar没有build path进去也要删掉)。

https请求忽略证书发送

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请求的例子,完美实现忽略证书,try it~

  • 全部评论(0)
最新发布的资讯信息
【系统环境|软件环境】如何成为一名大数据工程师?(2019-05-20 12:11)
【系统环境|Linux】大数据四大常识,不会你敢说自己在做大数据?(2019-05-19 11:39)
【系统环境|】需要同时掌握AVA和Linux,才可以继续大数据课程的学习(2019-05-18 10:28)
【系统环境|软件环境】学习大数据,一定要了解大数据的这些用途(2019-05-16 10:49)
【系统环境|Linux】bt宝塔控制面板mysql频繁自动停止详细解决办法(2019-05-16 08:52)
【系统环境|】大数据零基础学习路线,新人记得保存收藏哦(2019-05-15 10:54)
【系统环境|】全网最全最新的大数据系统学习路径(2019-05-14 15:38)
【系统环境|Linux】毕业设计:音乐分享系统(2019-05-14 07:48)
【系统环境|】教你零基础如何快速入门大数据技巧(2019-05-12 11:25)
【系统环境|】想学习大数据?这才是完整的大数据学习体系(2019-05-11 11:33)
手机二维码手机访问领取大礼包
返回顶部