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

  • 时间:2018-06-20 22:28 作者:Inn程序媛 来源:Inn程序媛 阅读:1893
  • 扫一扫,手机访问
摘要:最近做项目遇到一个需求,需要在新添加使用户成功后把该使用户信息同步到第三方系统中。第三方系统提供了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)
最新发布的资讯信息
【系统环境|】什么是Web?零基础能不能学Web前端开发?(2019-07-19 07:04)
【网页前端|HTML】为什么学Web前端?选择Web前端理由(2019-07-17 20:28)
【网页前端|JS】Java面经-百度新入职老哥整理近半年学习经验,面试刷题路线!(2019-07-16 22:16)
【网页前端|HTML】最全面的前端开发指南(2019-07-15 12:57)
【系统环境|数据库】零基础如何快速学好大数据?(2019-06-29 12:27)
【系统环境|Linux】零基础如何学好大数据?必备需要学习知识(2019-06-18 11:54)
【系统环境|】Hadoop环境中管理大数据存储八大技巧(2019-06-15 11:01)
【系统环境|服务器应用】现在国内IT行业是不是程序员过多了?(2019-06-11 06:34)
【系统环境|服务器应用】新贵 Flutter(2) 自己设置 Widget(2019-06-11 06:34)
【系统环境|服务器应用】Android完整知识体系路线(菜鸟-资深-大牛必进之路)(2019-06-11 06:34)
手机二维码手机访问领取大礼包
返回顶部