如何优雅的调用第三方接口

article/2025/8/27 6:18:48
 
点击上方蓝色“java大数据修炼之道”, 选择“设为星标”
每晚九点: 技术干货 👉 必定奉上

来源:blog.csdn.net/qq_35860138/article/details/82967727

在项目开发中经常会遇到调用第三方接口的情况,比如说调用第三方的天气预报接口。

# 使用流程

1、准备工作:在项目的工具包下导入HttpClientUtil这个工具类,或者也可以使用Spring框架的restTemplate来调用,上面有调用接口的方法【分为Get和Post方式的有参和无参调用】:

package com.njsc.credit.util;import java.io.IOException;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;public class HttpClientUtil {/*** 带参数的get请求* @param url* @param param* @return String*/
public static String doGet(String url, Map<String, String> param) {
// 创建Httpclient对象
CloseableHttpClient httpclient = HttpClients.createDefault();String resultString = "";
CloseableHttpResponse response = null;
try {
// 创建uri
URIBuilder builder = new URIBuilder(url);
if (param != null) {
for (String key : param.keySet()) {
builder.addParameter(key, param.get(key));
}
}
URI uri = builder.build();
// 创建http GET请求
HttpGet httpGet = new HttpGet(uri);
// 执行请求
response = httpclient.execute(httpGet);
// 判断返回状态是否为200
if (response.getStatusLine().getStatusCode() == 200) {
resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (response != null) {
response.close();
}
httpclient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return resultString;
}/*** 不带参数的get请求* @param url* @return String*/
public static String doGet(String url) {
return doGet(url, null);
}/*** 带参数的post请求* @param url* @param param* @return String*/
public static String doPost(String url, Map<String, String> param) {
// 创建Httpclient对象
CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse response = null;
String resultString = "";
try {
// 创建Http Post请求
HttpPost httpPost = new HttpPost(url);
// 创建参数列表
if (param != null) {
List<NameValuePair> paramList = new ArrayList<>();
for (String key : param.keySet()) {
paramList.add(new BasicNameValuePair(key, param.get(key)));
}
// 模拟表单
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList);
httpPost.setEntity(entity);
}
// 执行http请求
response = httpClient.execute(httpPost);
resultString = EntityUtils.toString(response.getEntity(), "utf-8");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
response.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return resultString;
}/*** 不带参数的post请求* @param url* @return String*/
public static String doPost(String url) {
return doPost(url, null);
}/*** 传送json类型的post请求* @param url* @param json* @return String*/
public static String doPostJson(String url, String json) {
// 创建Httpclient对象
CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse response = null;
String resultString = "";
try {
// 创建Http Post请求
HttpPost httpPost = new HttpPost(url);
// 创建请求内容
StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON);
httpPost.setEntity(entity);
// 执行http请求
response = httpClient.execute(httpPost);
resultString = EntityUtils.toString(response.getEntity(), "utf-8");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
response.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return resultString;
}
}

2、创建url和访问key 以及参数等:

314917c18b699238c9f6073aa5c76f37.png

代码如下:

/*** 聚合接口校验身份证* @param idCard* @param realName* @return boolean*/
public boolean identityCheck(String idCard, String realName){
logger.info("-----------------调用聚合数据 身份证验证API BEGIN--------------->");
String key = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
String url = "http://op.juhe.cn/idcard/query" + "?key=" + key + "&idcard=" + idCard + "&realname=" + realName;
logger.info("请求url:" + url);
boolean match = false; //是否匹配
try {
String result = HttpClientUtil.doGet(url);
System.out.println("请求结果:" + result);
IdentityCheckResult identityCheckResult = JsonUtils.parse(result, IdentityCheckResult.class);
IdentityCheck identityCheck = JsonUtils.parse(result, "result", IdentityCheck.class);
logger.info(identityCheckResult);
logger.info(identityCheck.toString());
if(identityCheckResult.correct() && identityCheck.getRes() == 1){
match = true;
}
} catch (Exception e) {
e.printStackTrace();
}
logger.info("<-----------------调用聚合数据 身份证验证API END---------------");
return match;
}

3、请求这个第三方接口:

使用HttpClientUtil工具类中的doGet方法来请求URL,得到结果,现在大多数是一个json字符串,类型为String

4、根据接口返回数据格式来解析数据:

129d7fcb60a154fa2cd561c2cf7d6ae8.png

可以看到,返回参数有六个,所以在项目中新建一个bean,包含以上六个字段,用来接住返回数据,如下:

99ab790df79e84ff708e5c6666273c72.png

因为接口返回的数据是一个json的字符串,类型实际上是一个String字符串,要解析数据,用工具类JsonUtils的parse方法将字符串转换为Java对象,JsonUtils的代码如下:

package com.eqianxian.commons.utils.json;import java.util.List;
import java.util.Map;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.PropertyFilter;
import com.alibaba.fastjson.serializer.SerializerFeature;/*** 在系统中统一使用这个,以方便将来切换不同的JSON生成工具* * @author KelvinZ* */
public class JsonUtils {
public static final int TYPE_FASTJSON = 0;
public static final int TYPE_GSON = 1;/*** <pre>* 对象转化为json字符串* * @param obj 待转化对象* @return 代表该对象的Json字符串*/
public static final String toJson(final Object obj) {
return JSON.toJSONString(obj);
// return gson.toJson(obj);
}/*** <pre>* 对象转化为json字符串* * @param obj 待转化对象* @return 代表该对象的Json字符串*/
public static final String toJson(final Object obj, SerializerFeature... features) {
return JSON.toJSONString(obj, features);
// return gson.toJson(obj);
}/*** 对象转化为json字符串并格式化* * @param obj* @param format 是否要格式化* @return*/
public static final String toJson(final Object obj, final boolean format) {
return JSON.toJSONString(obj, format);
}/*** 对象对指定字段进行过滤处理,生成json字符串* * @param obj* @param fields 过滤处理字段* @param ignore true做忽略处理,false做包含处理* @param features json特征,为null忽略* @return*/
public static final String toJson(final Object obj, final String[] fields, final boolean ignore,
SerializerFeature... features) {
if (fields == null || fields.length < 1) {
return toJson(obj);
}
if (features == null)
features = new SerializerFeature[] { SerializerFeature.QuoteFieldNames };
return JSON.toJSONString(obj, new PropertyFilter() {
@Override
public boolean apply(Object object, String name, Object value) {
for (int i = 0; i < fields.length; i++) {
if (name.equals(fields[i])) {
return !ignore;
}
}
return ignore;
}
}, features);
}/*** <pre>* 解析json字符串中某路径的值* * @param json* @param path* @return*/
@SuppressWarnings("unchecked")
public static final <E> E parse(final String json, final String path) {
String[] keys = path.split(",");
JSONObject obj = JSON.parseObject(json);
for (int i = 0; i < keys.length - 1; i++) {
obj = obj.getJSONObject(keys[i]);
}
return (E) obj.get(keys[keys.length - 1]);
}/*** <pre>* json字符串解析为对象* * @param json 代表一个对象的Json字符串* @param clazz 指定目标对象的类型,即返回对象的类型* @return 从json字符串解析出来的对象*/
public static final <T> T parse(final String json, final Class<T> clazz) {
return JSON.parseObject(json, clazz);
}/*** <pre>* json字符串解析为对象* * @param json json字符串* @param path 逗号分隔的json层次结构* @param clazz 目标类*/
public static final <T> T parse(final String json, final String path, final Class<T> clazz) {
String[] keys = path.split(",");
JSONObject obj = JSON.parseObject(json);
for (int i = 0; i < keys.length - 1; i++) {
obj = obj.getJSONObject(keys[i]);
}
String inner = obj.getString(keys[keys.length - 1]);
return parse(inner, clazz);
}/*** 将制定的对象经过字段过滤处理后,解析成为json集合* * @param obj* @param fields* @param ignore* @param clazz* @param features* @return*/
public static final <T> List<T> parseArray(final Object obj, final String[] fields, boolean ignore,
final Class<T> clazz, final SerializerFeature... features) {
String json = toJson(obj, fields, ignore, features);
return parseArray(json, clazz);
}/*** <pre>* 从json字符串中解析出一个对象的集合,被解析字符串要求是合法的集合类型* (形如:["k1":"v1","k2":"v2",..."kn":"vn"])* * @param json - [key-value-pair...]* @param clazz* @return*/
public static final <T> List<T> parseArray(final String json, final Class<T> clazz) {
return JSON.parseArray(json, clazz);
}/*** <pre>* 从json字符串中按照路径寻找,并解析出一个对象的集合,例如:* 类Person有一个属性name,要从以下json中解析出其集合:* {* "page_info":{* "items":{* "item":[{"name":"KelvinZ"},{"name":"Jobs"},...{"name":"Gates"}]* }* }* 使用方法:parseArray(json, "page_info,items,item", Person.class),* 将根据指定路径,正确的解析出所需集合,排除外层干扰* * @param json json字符串* @param path 逗号分隔的json层次结构* @param clazz 目标类* @return*/
public static final <T> List<T> parseArray(final String json, final String path, final Class<T> clazz) {
String[] keys = path.split(",");
JSONObject obj = JSON.parseObject(json);
for (int i = 0; i < keys.length - 1; i++) {
obj = obj.getJSONObject(keys[i]);
}
String inner = obj.getString(keys[keys.length - 1]);
List<T> ret = parseArray(inner, clazz);
return ret;
}/*** <pre>* 有些json的常见格式错误这里可以处理,以便给后续的方法处理* 常见错误:使用了\" 或者 "{ 或者 }",腾讯的页面中常见这种格式* * @param invalidJson 包含非法格式的json字符串* @return*/
public static final String correctJson(final String invalidJson) {
String content = invalidJson.replace("\\\"", "\"").replace("\"{", "{").replace("}\"", "}");
return content;
}/*** 格式化Json* * @param json* @return*/
public static final String formatJson(String json) {
Map<?, ?> map = (Map<?, ?>) JSON.parse(json);
return JSON.toJSONString(map, true);
}/*** 获取json串中的子json* * @param json* @param path* @return*/
public static final String getSubJson(String json, String path) {
String[] keys = path.split(",");
JSONObject obj = JSON.parseObject(json);
for (int i = 0; i < keys.length - 1; i++) {
obj = obj.getJSONObject(keys[i]);
System.out.println(obj.toJSONString());
}
return obj != null ? obj.getString(keys[keys.length - 1]) : null;
}}

bbdea70e456b99ff173b2f42eb86eeca.png热门推荐:

 

530adfaf5509f4075411862e154a12d5.gif

 
 
1. 记一次因 redis 导致应用卡死的过程。。。
2. 我这样写代码,比直接使用 MyBatis 效率提高了 100 倍 ?
3. 常见代码重构技巧(非常实用)
4. 定时任务的 5 种创建方式,还有谁不会!(建议收藏)5. 这 4 款 MySQL 调优工具 yyds
6. 这三种单点登录的方式你都Get吗?
 
 
 
 
 
 
 

如果觉得我的分享不错,欢迎大家随手点赞、在看13fc6d0580067e64fce56461232ad294.png

 
如果看到这里,说明你喜欢这篇文章, 标星(置顶)本公众号可以第一时间接受到博文推送。
 
 
 
 
 
 
 
喜欢文章,点个在看

http://chatgpt.dhexx.cn/article/MTOH8TuA.shtml

相关文章

Java 调用第三方接口,实战来了!

在项目开发中经常会遇到调用第三方接口的情况&#xff0c;比如说调用第三方的天气预报接口。 1、准备工作&#xff1a; 在项目的工具包下导入HttpClientUtil这个工具类&#xff0c;或者也可以使用Spring框架的restTemplate来调用&#xff0c;上面有调用接口的方法【分为Get和Po…

涉及到第三方支付接口该如何测试?

现在有不少测试朋友做的项目中&#xff0c;可能也会涉及到支付相关的功能。比如&#xff1a;做商城的&#xff0c;做游戏的以及其他在线交易的网站、APP等。如果支付出了问题&#xff0c;或者用户拿少的钱通过篡改请求数据购买大金额的商品&#xff0c;如果是实物的话&#xff…

第三方支付api接口是什么?

由于移动互联网的不断发展&#xff0c;从而产生了第三方和第四方支付&#xff0c;而第三方成为商业交易的环节不可缺失的一个总要部分&#xff0c;作为第三方&#xff0c;通过央行的授权&#xff0c;一般都覆盖了很多支付通道&#xff0c;给予需求企业最便捷、高效的接入方式&a…

Java 调用第三方接口方法

Java 调用第三方接口方法 一、 通过JDK网络类Java.net.HttpURLConnection 1.java.net包下的原生java api提供的http请求 使用步骤&#xff1a; 1、通过统一资源定位器&#xff08;java.net.URL&#xff09;获取连接器&#xff08;java.net.URLConnection&#xff09;。 2、设…

Java调用第三方接口示范

人工智能&#xff0c;零基础入门&#xff01;http://www.captainbed.net/inner 在项目开发中经常会遇到调用第三方接口的情况&#xff0c;比如说调用第三方的天气预报接口。 使用流程 【1】准备工作&#xff1a;在项目的工具包下导入HttpClientUtil这个工具类&#xff0c;或者…

调用第三方接口

快速使用&#xff1a;调用第三方接口获取数据&#xff08;简易版&#xff09;_myme95的博客-CSDN博客_调用第三方接口 controller层 private String jokeApiKey "40ff81dexxxxxxxxxxxx97a39d39";AutowiredApiService apiService;/*** 京东万象-笑话api*/GetMapping(…

国内7款API供应平台功能对比及详细介绍

我们都知道一句话“巧妇难为无米之炊”&#xff0c;数据源就是数据产生价值中的那些大米。那大数据时代企业需要哪些数据呢&#xff1f;根据我个人理解我觉得可以大致分为以下几类&#xff1a; 1、&#xff08;内部&#xff09;企业自身业务生产经营环节产生的内部数据【包括销…

Java Web系统常用的第三方接口

1. Web Service 接口 1.1 接口方式说明和优点 在笔者的开发生涯中&#xff0c;当作为接口提供商给第三方提供接口时&#xff0c;以及作为客户端去调用第三方提供的接口时&#xff0c;大部分时候都是使用 Web Service接口&#xff0c; Web Service作为接口使用广泛的…

进制转换2

进制之间的转换 本文转自&#xff1a;http://www.bloghome.cn/posts/38472 数学 /bullly 发表于2006-07-11, 18:08 不同进制之间的转换纯粹是数学上的计算。不过&#xff0c;你不必担心会有么复杂&#xff0c;无非是乘或除的计算。 生活中其实很多地方的计数方法都多少有点不…

计算机二进制

二进制转十进制 不考虑符号为 十进制转二进制 奇数要算一次 1 / 2 偶数不需要 计算 1 / 2 奇数要算一次 1 / 2 偶数不需要 计算 1 / 2 奇数要算一次 1 / 2 偶数不需要 计算 1 / 2 奇数要算一次 1 / 2 偶数不需要 计算 1 / 2 奇数要算一次 1 / 2 偶数不需要 计算 1 / 2 奇数…

-2进制

http://oj.acm.zstu.edu.cn/JudgeOnline/problem.php?id4435 懵~ 后来问别人&#xff0c;他让我试着用二进制反推十进制&#xff0c;就晓得了(用&#xff08;-2&#xff09;^n&#xff09;。 这个是学长写的代码 //我写的时候&#xff0c;将它先变成二进制&#xff0c;再给每…

进制.2

转自&#xff1a; http://www.d2school.com/bhcpp_book/5_8.php 5.8.1 十六进制 说到十六进制&#xff0c;首先会问&#xff1a;总共只有10个阿拉伯数字&#xff1a;0、1、2、3、4、5、6、7、8、9&#xff0c;如何表达“逢16进1”的概念呢&#xff1f;方法是用英文字母&#x…

二进制及二进制转换

二进制是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数。它的基数为2&#xff0c;进位规则是“逢二进一”&#xff0c;借位规则是“借一当二” 二进制数&#xff08;binaries&#xff09;是逢2进位的进位制&#xff0c;0、1是基本算符 [2] &#xff1…

二进制?十进制!

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 给定两个十进制整数 : AAA,BBB 你需要把它们的二进制形式以十进制的运算法则相加输出结果。 例如&#xff1a; A3,B2A 3 , B 2A3,B2 的时候&#xff0c;AAA 的二进制表示是 : 111111 , BB…

关于二进制???

文章目录 二进制二进制转化为十进制十进制转化成二进制无符号数和有符号数原码反码补码 二进制的计算规则 二进制 二进制转化为十进制 二进制是一套计数方法&#xff0c;每个数位有0、1两种可能&#xff0c;类比在日常生活中我们使用的十进制&#xff0c;每个数位有0-9十种可…

二进制及二进制的转换

二进制&#xff08;binary&#xff09;是在数学和数字电路中指以2为基数的记数系统&#xff0c;是以2为基数代表系统的二进位制。这一系统中&#xff0c;通常用两个不同的符号0&#xff08;代表零&#xff09;和1&#xff08;代表一&#xff09;来表示 [1] 。数字电子电路中&a…

二进制转换

1、十进制数45转换为二进制 &#xff08;1&#xff09;除二取余法 除数被除数余数24512220211125122021120 自下往上&#xff1a;101101 &#xff08;2&#xff09;2的幂做加法 45 32 841 对应的是101101 2、二进制转负整数 以11010011为例子 先减1 11010010 按…

什么是二进制,进制之间是如何转换的,浅显易懂的,一看就会

什么是二进制呢? 二进制数据是用0和1两个数码来表示的数,它的基数为2,进位规则是逢二进一 加法:000;101;011;110(等价于10,向前进一) 案例(前面用0补齐) 1110,10111,111100,1001101,1011110,1101111,11111000 ... 减法: 0&#xff0d;00&#xff0c;1&#xff0d;01&#xf…

二进制详解

在计算机的世界里&#xff0c;只有0和1&#xff0c;也就是二进制。 那如何把一个十进制的数转成二进制或者其他进制&#xff0c;请下图&#xff1a; 十进制转二进制 十进制的123转成二进制就是1111011&#xff0c;转成几进制都是一个道理。 一、二进制 1.1 二进制是计算机采…

几何平均数

几何平均数是n个变量值连乘积的n次方根。 [2] 分为简单几何平均数与加权几何平均数。 1、简单几何平均数&#xff1a; 几何平均数示意图 2、加权几何平均数&#xff1a; 转载于:https://www.cnblogs.com/kakaisgood/p/9981420.html