最近项目中需要调用第三方的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调用第三方接口的更多相关文章

  1. SpringMVC 结合HttpClient调用第三方接口实现

    使用HttpClient 依赖jar包 1:commons-httpclient-3.0.jar 2:commons-logging-1.1.1.jar 3:commons-codec-1.6.jar ...

  2. Java调用第三方接口示范

    在项目开发中经常会遇到调用第三方接口的情况,比如说调用第三方的天气预报接口. 使用流程[1]准备工作:在项目的工具包下导入HttpClientUtil这个工具类,或者也可以使用Spring框架的res ...

  3. java springboot调用第三方接口 借助hutoool工具类 爬坑

    楼主是个后端小白一枚,之前没接触过后端,只学了java基本语法,还是在学校老师教的,学的很浅,什么ssh.ssm框架都没有学,最近在自学spring boot,看书学也看不是很懂,就在b站上看教学视频 ...

  4. Java之HttpClient调用WebService接口发送短信源码实战

    摘要 Java之HttpClient调用WebService接口发送短信源码实战 一:接口文档 二:WSDL 三:HttpClient方法 HttpClient方法一 HttpClient方法二 Ht ...

  5. java代码调用第三方接口

    一.利用httpclient来字符串参数(url是第三方接口,不带参数,如:http://192.168.16.200:8081/faceInfo/list,param是url后面所要带的参数) pu ...

  6. Java调用第三方接口工具类(json、form)

    1.JSON值访问 /** * 调用对方接口方法 * @param path 对方或第三方提供的路径 * @param data 向对方或第三方发送的数据,大多数情况下给对方发送JSON数据让对方解析 ...

  7. 使用WebClient调用第三方接口

    需要调用一个第三方接口,传参返回数据 本来是很简单的一个需求,搞了一天没整好 首先在POSTMAN中测试没有问题,但是使用jquery ajax在前台就会涉及到跨域 虽然设置了 无论怎么写都会报错 C ...

  8. httpclient调用webservice接口的方法实例

    这几天在写webservice接口,其他的调用方式要生成客户端代码,比较麻烦,不够灵活,今天学习了一下httpclient调用ws的方式,感觉很实用,话不多说,上代码 http://testhcm.y ...

  9. php 自己封装一个调用第三方接口的函数

    ①在php.ini中开启php_curl扩展(必须开启) ②建议在php.ini中开启php_openssl扩展(本身不是curl必须的,是调用一些第三方接口需要的 ③如果以上操作重启apache后, ...

随机推荐

  1. js实现元素水平垂直居中

    之前有写过css/css3实现元素的水平和垂直居中的几种方法点我,但是css3属性不是所有浏览器都能兼容的,今天写下js实现未知宽高的元素的水平和垂直居中. <!DOCTYPE html> ...

  2. R in action 读书笔记(1)--第五章:高级数据管理

    5.2.1数学函数 函数 描述 abs(x) 绝对值 sqrt(x) 平方根 ceiling(x) 不小于x的最小整数 floor(x) 不大于x的最大整数 trunc(x) 向0的方向截取的X中的整 ...

  3. IE盒模型和标准w3c盒模型

    Margin(外边距) - 清除边框外的区域,外边距是透明的.Border(边框) - 围绕在内边距和内容外的边框.Padding(内边距) - 清除内容周围的区域,内边距是透明的.Content(内 ...

  4. (转) 淘淘商城系列——解决KindEditor上传图片浏览器兼容性问题

    http://blog.csdn.net/yerenyuan_pku/article/details/72808229 上文我们已实现了图片上传功能,但是有个问题,那就是对浏览器兼容性不够,因为Map ...

  5. CREATE CONVERSION - 定义一个用户定义的码制转换

    SYNOPSIS CREATE [DEFAULT] CONVERSION name FOR source_encoding TO dest_encoding FROM funcname DESCRIP ...

  6. 查看DNS、IP、Mac等

    A.Win98:winipcfg  B.Win2000以上:Ipconfig/all  C.NSLOOKUP:如查看河北的DNS  C:\\>nslookup  Default Server: ...

  7. 获取汉字的拼音首字母--pinyin

    var pinyin = (function (){ var Pinyin = function (ops){ this.initialize(ops); }, options = { checkPo ...

  8. jQuery中Ajax事件beforesend及各参数含义1

    jQuery中Ajax事件beforesend及各参数含义 转自:http://blog.sina.com.cn/s/blog_609f9fdd0100wprz.html Ajax会触发很多事件. 有 ...

  9. extjs动态添加列

    可以根据日期,动态的插入一列 controller层: StdDayWordQuery:function(btn,event){ var form=Ext.getCmp('queryFormSDW') ...

  10. CSS Paint API绘制透明格子背景实例页面

    CSS代码: .box { width: 180px; height: 180px; background: paint(transparent-grid); } HTML代码: <div cl ...