使用HttpClient调用第三方接口
最近项目中需要调用第三方的Http接口,这里我用到了HttpClient。
首先我们要搞明白第三方接口中需要我们传递哪些参数、数据,搞明白参数以后我们就可以使用HttpClient调用接口了。
1.调用Post方法。
HttpClient初始化与参数设置
public class HttpClientUtils{
private static final Integer DEFAULT_MAX_TOTAL = 200;
private static final Integer DEFAULT_MAX_PER_ROUTE = 20;
private static final String TLS_V1_PROTOCAL = "TLSv1";
private static final String TLS_V1_1_PROTOCAL = "TLSv1.1";
private static final String TLS_V1_2_PROTOCAL = "TLSv1.2";
private static final String SSL_V3_PROTOCAL = "SSLv3";
public static final String HTTP_PROTOCAL = "http";
public static final String HTTPS_PROTOCAL = "https";
private final Logger logger = LoggerFactory.getLogger(getClass());
private PoolingHttpClientConnectionManager cm;
private Registry<ConnectionSocketFactory> registry;
private void init() {
try {
SSLContextBuilder builder = SSLContexts.custom();
builder.loadTrustMaterial(null, (chain, authType) -> true);
SSLContext sslContext = builder.build();
SSLConnectionSocketFactory sslSF = new SSLConnectionSocketFactory(
sslContext, new String[] {TLS_V1_PROTOCAL, TLS_V1_1_PROTOCAL, TLS_V1_2_PROTOCAL, SSL_V3_PROTOCAL}, null, NoopHostnameVerifier.INSTANCE);
registry = RegistryBuilder
.<ConnectionSocketFactory> create()
.register(HTTP_PROTOCAL, PlainConnectionSocketFactory.INSTANCE)
.register(HTTPS_PROTOCAL, sslSF)
.build();
cm = new PoolingHttpClientConnectionManager(registry);
cm.setMaxTotal(DEFAULT_MAX_TOTAL);
cm.setDefaultMaxPerRoute(DEFAULT_MAX_PER_ROUTE);
} catch (Exception ex) {
logger.error("Can't initialize connection manager! Exiting");
System.exit(FATAL_EXIT_CODE);
}
}
public HttpClientUtils() {
init();
}
public HttpPost requestParam(String url, String jsonStr) throws UnsupportedEncodingException {
if (StringUtils.isBlank(url) || StringUtils.isBlank(jsonStr)) {
throw new InvalidParameterException("Invalid url or requestJson");
}
HttpPost request = new HttpPost(url);
StringEntity se = new StringEntity(jsonStr);
request.setEntity(se);
request.setHeader("Accept", "application/json");
request.setHeader("Content-type", "application/json");
if (StringUtils.isNotBlank(applicationProperties.getHrgenieHttpProxyHost())) {
HttpHost proxy = new HttpHost("127.0.0.1", "8080"); // 代理主机地址与端口
RequestConfig config = RequestConfig.custom().setProxy(proxy).build();
request.setConfig(config);
}
return request;
}
public CloseableHttpClient getConnection() {
return HttpClients.custom().setConnectionManager(cm).build();
}
}
2.对象与Json互转
public class CommunicateUtil {
public static Optional<String> objToJson(Object object) {
ObjectMapper mapper = new ObjectMapper();
String jsonStr = null;
try {
jsonStr = mapper.writeValueAsString(object);
} catch (JsonProcessingException ex) {
ex.printStackTrace();
}
return Optional.ofNullable(jsonStr);
}
public static <T> Optional<T> jsonToObj(String json, Class<T> clz) {
ObjectMapper mapper = new ObjectMapper();
T objToRet = null;
try {
objToRet = mapper.readValue(json, clz);
} catch (IOException ex) {
ex.printStackTrace();
}
return Optional.ofNullable(objToRet);
}
}
3.执行httpclient并解析返回数据(Response 对象按照自己的需求封装)。
public class CommunicateImpl implements Communicate{
private static Logger logger = LoggerFactory.getLogger(CommunicateImpl.class);
@Autowired
private HttpConnectionManager httpConnectionManager;
public <V, K> V communicateCategory(K k, Class<V> respClz) {
String targetUrl= "https://xxx.xxx.com/api/v1/xxx"; // 目标第三方接口的url
Optional<String> reqJson = CommunicateUtil.objToJson(k);
HttpPost postReq = null;
try {
postReq = httpConnectionManager.requestParam(targetUrl, reqJson.get());
} catch (IOException ex) {
logger.error("Exception thrown when getting request, exception is:{}", ex);
throw new RuntimeException("Invalid request!");
}
V snqResponse = null;
CloseableHttpClient httpClient = httpConnectionManager.getConnection();
try (CloseableHttpResponse response = httpClient.execute(postReq)) {
snqResponse = parseResponse(response, respClz);
} catch (IOException ex) {
logger.error("Exception thrown when getting the response, exception is:{}", ex);
throw new RuntimeException("Invalid request!");
}
return snqResponse;
}
@Override
public Response communicate(Request request) {
return communicateCategory(request, Response.class);
}
private <T> T parseResponse(CloseableHttpResponse response, Class<T> clz) throws IOException {
logger.warn("Response to parse: ", response);
HttpEntity entity = response.getEntity();
if (Objects.isNull(entity)) {
throw new RuntimeException("Invalid response! Entity is null!");
}
String retSrc = EntityUtils.toString(entity);
Optional<T> optRet = CommunicateUtil.jsonToObj(retSrc, clz);
return optRet.orElseThrow(() -> new RuntimeException("Invalid response!"));
}
public interface Communicate{
Response communicate(Request request);
}
使用HttpClient调用第三方接口的更多相关文章
- SpringMVC 结合HttpClient调用第三方接口实现
使用HttpClient 依赖jar包 1:commons-httpclient-3.0.jar 2:commons-logging-1.1.1.jar 3:commons-codec-1.6.jar ...
- Java调用第三方接口示范
在项目开发中经常会遇到调用第三方接口的情况,比如说调用第三方的天气预报接口. 使用流程[1]准备工作:在项目的工具包下导入HttpClientUtil这个工具类,或者也可以使用Spring框架的res ...
- java springboot调用第三方接口 借助hutoool工具类 爬坑
楼主是个后端小白一枚,之前没接触过后端,只学了java基本语法,还是在学校老师教的,学的很浅,什么ssh.ssm框架都没有学,最近在自学spring boot,看书学也看不是很懂,就在b站上看教学视频 ...
- Java之HttpClient调用WebService接口发送短信源码实战
摘要 Java之HttpClient调用WebService接口发送短信源码实战 一:接口文档 二:WSDL 三:HttpClient方法 HttpClient方法一 HttpClient方法二 Ht ...
- java代码调用第三方接口
一.利用httpclient来字符串参数(url是第三方接口,不带参数,如:http://192.168.16.200:8081/faceInfo/list,param是url后面所要带的参数) pu ...
- Java调用第三方接口工具类(json、form)
1.JSON值访问 /** * 调用对方接口方法 * @param path 对方或第三方提供的路径 * @param data 向对方或第三方发送的数据,大多数情况下给对方发送JSON数据让对方解析 ...
- 使用WebClient调用第三方接口
需要调用一个第三方接口,传参返回数据 本来是很简单的一个需求,搞了一天没整好 首先在POSTMAN中测试没有问题,但是使用jquery ajax在前台就会涉及到跨域 虽然设置了 无论怎么写都会报错 C ...
- httpclient调用webservice接口的方法实例
这几天在写webservice接口,其他的调用方式要生成客户端代码,比较麻烦,不够灵活,今天学习了一下httpclient调用ws的方式,感觉很实用,话不多说,上代码 http://testhcm.y ...
- php 自己封装一个调用第三方接口的函数
①在php.ini中开启php_curl扩展(必须开启) ②建议在php.ini中开启php_openssl扩展(本身不是curl必须的,是调用一些第三方接口需要的 ③如果以上操作重启apache后, ...
随机推荐
- WP7 开发资料
前言 离Windows Phone 7正式发布已过去几个月了,但国内关于Windows Phone 7的中文书籍资料太少了,大多数是英文资料,一本真正的中文开发教程书都没有, 要啃英文资料对大部分的开 ...
- VUE 入坑系列 一 双向绑定
html代码 <div id="app"> <p>{{message}}</p> <span>message1</span&g ...
- zTree 点击文字 勾选check
callback: { onClick:function(event, treeId, treeNode){ console.info("onClick") var treeObj ...
- vue之package.json文件解析
1.package.json是什么? 什么是Node.js的模块(Module)?在Node.js中,模块是一个库或框架,也是一个Node.js项目.Node.js项目遵循模块化的架构,当我们创建了一 ...
- CSS工具、CSS重置(CSS Reset)
样式重置的目的是减少浏览器的不一致性,例如line-height,margin,标题的font-size大小等等.样式重置经常在CSS框架中出现. 这里的重置样式故意写的很一般,例如没有为body元素 ...
- 原生javascript实现call、apply和bind的方法
var context = {id: 12}; function fun (name, age) { console.log(this.id, name, age) } bind bind() 方法会 ...
- 使用ajax解析后台json数据时:Unexpected token o in JSON at position 1
json数据解析异常 今天在做json数据的时候,出现了如下错误,说是解析异常. VM1584:1 Uncaught SyntaxError: Unexpected token o in JSON a ...
- Git 教程 -- 第一天
什么是Git? Git是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本管理. 为什么使用Git? 众所周知,版本控制系统分为集中式版本控制系统(SVN.CVS等)与分布式版 ...
- 树莓派 - RPi.GPIO
RPi.GPIO是通过Python/C API实现的,C代码操作底层寄存器, python通过Python/C API调用这些C接口. 这是关于RPi.GPIO项目的介绍. 其中提到了有python ...
- python+selenium之元素的八大定位方法
以百度搜索框为例,先打开百度网页 1.点右上角爬虫按钮 2.点左下角箭头 3.讲箭头移动到百度搜索输入框上,输入框高亮状态 4.下方红色区域就是单位到输入框的属性: <input id=&quo ...