最近项目中需要调用第三方的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. 老式浏览器支持html5和css3

    在IE页面的head标签里面加入   <!-[if IE]> <script src="http://html5shiv.googlecode.com/svn/trunk/ ...

  2. 原生开发之css样式问题(持续更新)

    ·移动端开发将div高度设置为设备高度 div{ Height:100vh; } · select选择器文字设置: /*select文字右对齐*/ select{ direction: rtl; } ...

  3. esp8266 串口通讯

    1.发送 调用uart_init(115200,115200);初始化串口,波特率设置为115200.前面一个是设置uart0的波特率.后面一个是设置.uart的波特率 然后就可以使用uart0_tx ...

  4. Unity中,保存在OnInspectorGUI中改变的值

    using UnityEngine; using System.Collections; using UnityEditor; [CustomEditor( typeof( MessageLog ) ...

  5. git 学习笔记1

    目前我属于粗放型的[学习者],接下来需要做一些改变,让自己更加规范.首先需要学习的就是版本控制系统,本科在工作室的时候使用过一点Subversion,不过到现在已经基本没有印象了.git现在越来越成为 ...

  6. Vue + Django 2.0.6 学习笔记 6.1-6.2 商品类别数据接口

    这两节主要是说获取商品类别的1 2 3类的列表和某个类的详情 我直接上代码吧 views.py: from .serializers import CategorySerializer class C ...

  7. ALTER LANGUAGE - 修改一个过程语言的定义

    SYNOPSIS ALTER LANGUAGE name RENAME TO newname DESCRIPTION 描述 ALTER LANGUAGE 修改一门语言的定义. 目前唯一的功能就是重命名 ...

  8. vue的[__ob__: Observer]

    为什么会获取不到里面的值 因为:vue data 里面值都是有这个属性的.这是被vue接管的数据,observer是Vue核心中最重要的一个模块(个人认为),能够实现视图与数据的响应式更新,底层全凭o ...

  9. C#readonly 关键字与 const 关键字的区别

    1. const 字段只能在该字段的声明中初始化,readonly 字段可以在声明或构造函数中初始化.因此,根据所使用的构造函数,readonly 字段可能具有不同的值. 2. const 字段是编译 ...

  10. node.js 的介绍

    1.node.js是什么? (1)node.js不是一门编程语言, 是一个开发平台,就像Java开发平台,Net平台,PHP开发平台,Apple开发平台.(何为开发平台?有对应的编程语言,有语言运行时 ...