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

  • 时间:2018-06-20 22:28 作者:Inn程序媛 来源:Inn程序媛 阅读:2430
  • 扫一扫,手机访问
摘要:最近做项目遇到一个需求,需要在新添加使用户成功后把该使用户信息同步到第三方系统中。第三方系统提供了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前端开发需要学习哪些技术(2019-09-17 18:00)
【系统环境|】学习web前端开发是正确的选择(2019-09-15 16:55)
【系统环境|】干货整理!零基础html5网站开发学习步骤方法(保存不后悔)(2019-09-10 16:27)
【系统环境|】「前端入门」前端基本概念(2019-09-07 21:36)
【系统环境|】小白入门学习web前端,这些干货不能少(2019-09-05 20:59)
【系统环境|】不是计算机专业,哪个专业更适合学习web前端(2019-09-03 20:31)
【系统环境|】入行web前端开发可以做什么工作(2019-09-02 20:51)
【系统环境|】什么是Web前端呢?为什么说web前端开发人员的薪资高、前景好呢?(2019-08-31 20:55)
【系统环境|】2019年Web前端开发的8个趋势,你知道几个?(2019-08-29 16:23)
【系统环境|】学习web前端,掌握这些,才有底气跟面试官提薪资(2019-08-28 15:23)
手机二维码手机访问领取大礼包
返回顶部