使用SpringBoot RestTemplate实现第三方接口对接

使用SpringBoot RestTemplate实现第三方接口对接实现对接第三方接口,可以使用HttpClient(年岁较久),也可以使用SpringBootRestTemplate(新生代)。可根据个人喜好选择适当的方式进行对接,个人推荐使用SpringBootRestTemplate。具体使用如下:自定义配置类:application.yml文件中配置:注意:对应XXXConfig实体类中属性,在application.yml中配置必须在同一级…

大家好,又见面了,我是你们的朋友全栈君。

实现对接第三方接口,可以使用HttpClient(年岁较久),也可以使用SpringBoot RestTemplate(新生代)。可根据个人喜好选择适当的方式进行对接,相比较HttpClient个人推荐使用SpringBoot RestTemplate。

另一种方法更简便明了:第三方接口调用:BasicNameValuePair封装post请求中的参数名称和值。

SpringBoot RestTemplate具体使用如下:

自定义配置类:
  • application.yml文件中配置:
    注意:对应XXXConfig实体类中属性,在application.yml中配置必须在同一级别。如下图:baseAPIURL、id、uCode
    在这里插入图片描述
  • XXXConfig实体类示例:
    注意:自定义实体类上方加@ConfigurationProperties(prefix = “xxx.xxx”)注解。
    该注解的作用是:读取在yml文件或者properties文件中配置的信息,并自动封装成实体类(如下:XXXConfig)。
    当我们需要这些配置信息时,直接@Autowired就行,方便快捷。
@Data
@Component
@ConfigurationProperties(prefix = "xxx.api")
public class XXXConfig { 
   
  /** * API 地址(一般是域名) */
  private String baseAPIURL;
  /** * ID(根据接口文档定义就好) */
  private String id;
  /** * 接入码 */
  private String uCode;
}
自定义接口请求类和响应类:
  • 请求类:(公用的属性可以提取一个Base类,自定义的请求类去继承该Base类)
@Data
public class XXXReq extends XXXBase { 
   

	// 请求路径
  public static final String REQ_URL = "xxxxxxxxx";

  /** * 请求参数 */
  private String XXXX;
}
  • 响应类:
@Data
public class XXXResp implements Serializable { 
   

    /** * code */
    private Integer code;
    /** * 提示信息 */
    private String msg;
    /** * 具体数据 */
    private Map<String,Object> data;
}
生成签名:

下图方法中入参params:表示你生成sign需要的参数。

大多数签名规则都是:拼接字符串,根据post请求参数keyASCII排序,生成一个字符串,然后对这个字符串进行MD5或者BCrypt加密,然后再将加密后的字符串转换成大写,得到的字符串作为sign。
在这里插入图片描述
附:MD5加密工具类:

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/** * @author wangyan@163.com * @version 1.0 * @date 2019-10-24 19:20 */
public class Md5Encrypt { 

/** * Used building output */
private static final char[] DIGITS = { 
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a',
'b', 'c', 'd', 'e', 'f'};
/** * 对字符串进行MD5加密 * * @param text 明文 * @return 密文 */
public static String md5(String text) { 

MessageDigest msgDigest = null;
try { 

msgDigest = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) { 

throw new IllegalStateException("System doesn't support MD5 algorithm.");
}
try { 

msgDigest.update(text.getBytes("UTF-8")); // 注意改接口是按照指定编码形式签名
} catch (UnsupportedEncodingException e) { 

throw new IllegalStateException("System doesn't support your EncodingException.");
}
byte[] bytes = msgDigest.digest();
String md5Str = new String(encodeHex(bytes));
return md5Str;
}
private static char[] encodeHex(byte[] data) { 

int l = data.length;
char[] out = new char[l << 1];
// two characters form the hex value.
for (int i = 0, j = 0; i < l; i++) { 

out[j++] = DIGITS[(0xF0 & data[i]) >>> 4];
out[j++] = DIGITS[0x0F & data[i]];
}
return out;
}
public static void main(String[] args) { 

System.out.println(Md5Encrypt.md5(Md5Encrypt.md5("123456" + "shanshi")));
}
}
接口:
  XXXResp xxxApiCall(xxxxReq xxReq);
实现类:
 @Override
public XXXResp xxxApiCall(xxxxReq xxReq) { 

//生成签名的公共请求map字段可提取一个方法mapUtil(),下面会附录。
// 该map是为了生成sign
Map map = signUtil.mapUtil();
// 非公用的属性可在这里赋值
map.put("xxxx", xxReq.getXXXX());
//param是接口请求参数
MultiValueMap<String, Object> param = signUtil.multiValueMap(map);
// 除了公用请求参数以外的请求参数,可在此添加
param.add("xxxx", xxReq.getXXXX());
// 请求全路径
String requestUrl = xxxConfig.getBaseAPIURL() + xxReq.REQ_URL;
// apiUtil.sendPost为发送请求方法
// paramList表示你请求接口的参数
// url表示请求的接口路径(全路径:域名+接口路径)
// 下面会介绍。
Map result = apiUtil.sendPost(param, requestUrl);
// signUtil.responseUtil为自定义返回数据解析方法,下面会附录。
return signUtil.responseUtil(result);
}
控制层:
 @PostMapping(value = "/XXXX")
@PreAuthorize("hasAnyRole('ADMIN','PRICE_ALL','PRICE_SELECT')")
@ResponseBody
public ResponseEntity getStockPrice(@RequestBody XXXReq xxxReq) { 

xxxService.xxxApiCall(xxxReq);
return new ResponseEntity(xxxService.xxxApiCall(xxxReq), HttpStatus.OK);
}
定义BeanConfig(实例RestTemplate对象)

在这里插入图片描述

请求类

paramList表示你请求接口的参数
url表示请求的接口路径(全路径:域名+接口路径)
result.getBody()就是响应回来的数据,根据自己业务要求处理数据即可。
在这里插入图片描述

效果图:

在这里插入图片描述
附录:

 /** * 生成签名公共请求map字段 * * @return */
public Map mapUtil() { 

Map<String, Object> map = new HashMap<>();
map.put("id", xxxConfig.getId());
map.put("timeStamp", xxxx.DateUtil.getTimeStamp());
map.put("uCode", xxxConfig.getUCode());
return map;
}
/** * 第三方接口请求参数公用字段 * * @param map * @return */
public MultiValueMap<String, Object> multiValueMap(Map map) { 

MultiValueMap<String, Object> param = new LinkedMultiValueMap<>();
param.add("id", map.get("id"));
param.add("uCode", map.get("uCode"));
param.add("timeStamp", map.get("timeStamp"));
param.add("sign", SignUtil.createSign(map));
return param;
}
/** * 返回数据解析 * * @param resultMap * @return */
public XXXResp responseUtil(Map resultMap) { 

XXXResp xxxResp = new XXXResp();
xxxResp.setCode((Integer) resultMap.get("code"));
xxxResp.setMsg((String) resultMap.get("msg"));
xxxResp.setData((Map) resultMap.get("data"));
return xxxResp;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/138952.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 手机解锁侧面好用还是屏下指纹好用_侧边指纹怎么锁屏

    手机解锁侧面好用还是屏下指纹好用_侧边指纹怎么锁屏说起手机解锁方式,目前智能手机市场上基本上都采用的是屏下指纹、后置指纹和侧面指纹。不少人觉得在一些表现上侧面指纹不如其他两种解锁方式,其实你低估了侧面指纹,它远远比你想象中的还强大!一、外观一体化相比那些搭载后置指纹解锁技术的手机,手机搭载侧面指纹会更加的美观。它既不破坏手机正面屏幕,也不破坏背面机身的完整性,保证了机身的一体化。二、增大用户的解锁姿势相比后置指纹和屏下指纹解锁,侧面指纹简直…

  • Linux 的解压缩文件命令「建议收藏」

    Linux 的解压缩文件命令「建议收藏」博客园首页新随笔联系管理随笔-122 文章-0 评论-14 压缩文件 tar -zcvf my.tarabcabc.txtar命令可以用来压缩打包单文件、多个文件、单个目录、多个目录。常用格式:单个文件压缩打包tarczvfmy.tarfile1多个文件压缩打包tarczvfmy.tarfile1file2,…单个目录压缩打包tarczvfmy.tar…

  • pthreads php 安装全过程(二)

    pthreads php 安装全过程(二)

  • 协方差矩阵计算方法[通俗易懂]

    协方差矩阵计算方法[通俗易懂]1.协方差矩阵X,YX,YX,Y是两个随机变量,X,YX,YX,Y的协方差Cov(X,Y)Cov(X,Y)Cov(X,Y)定义为:cov(X,Y)=E[(X−μx)(Y−μy)]cov(X,Y)=E[(X-\mu_x)(Y-\mu_y)]cov(X,Y)=E[(X−μx​)(Y−μy​)]其中:E(X)=μx,E(Y)=μyE(X)=\mu_x,E(Y)=\mu_yE(X)=…

  • 搭建Eurake集群

    搭建Eurake集群eureka作为SpringCloud的服务发现与注册中心,在整个的微服务体系中,处于核心位置。单一的eureka服务,显然不能满足高可用的实际生产环境,这就要求我们配置一个能够应对各种突发情况,具有较强容灾能力的eureka集群服务。其实我们只需要在部署时候,对eureka的配置文件做相应的修改,运行即可。在项目中,创建三个名字分别为eureka01,eureka02,eureka03的eur…

  • 感觉自己不会的东西太多了,不知道如何下手?

    感觉自己不会的东西太多了,不知道如何下手?GitHub8.8kStar的Java工程师成神之路,不来了解一下吗?GitHub8.8kStar的Java工程师成神之路,真的不来了解一下吗?GitHub8.8kStar的Java工程师成神之路,真的确定不来了解一下吗?如果让我统计下,粉丝问我做多的问题是什么,这个问题肯定可以排前5,问出这个问题的朋友们遍布各个年龄段。实话说,这个问题同样也困扰过我,大概就是我刚…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号