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

本文介绍了如何在Java后端通过HTTPClient库发送HTTPS请求,特别是当需要忽略证书验证时的实现步骤。文章详细展示了创建SSLContextBuilder、设置忽略证书的策略以及构建和执行POST请求的过程,以JSON格式传递参数。
摘要由CSDN通过智能技术生成

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

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

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

需要两个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);

Registryregistry = RegistryBuilder.create()

.register("http", new PlainConnectionSocketFactory())

.register("https", sslConnectionSocketFactory)

.build();

PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(registry);

cm.setMaxTotal(100);

CloseableHttpClienthttpClient= 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);

Registryregistry = 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();

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值