使用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;
    }
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

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

(0)
上一篇 2022年5月30日 下午4:00
下一篇 2022年5月30日 下午4:00


相关推荐

  • dirsearch讲解_中国指南网

    dirsearch讲解_中国指南网获取更多学习资料、想加入社群、深入学习,请扫我的二维码或加Memory20000427。在本文中,我们将学习如何使用Dirsearch。说起国内的御剑套装,相信各位都已经非常熟悉了。但御剑已经好多年不更新了,而且需要windows,有时候线程设置大了点,扫了半天中途还可能卡住不动了,也没有实时的数据保存,前功尽弃。总之各种不爽。现在好用的webscanner也层出不穷,我根据自己的需求和实际使用体验,最终选择了dirsearch这款工具。基本情况它是一个命令行工具,旨在暴力激活成功教程网站中的目录和

    2026年4月16日
    6
  • PHP多进程 基于Redis实现轻量级延迟队列[通俗易懂]

    PHP多进程 基于Redis实现轻量级延迟队列

    2022年2月12日
    52
  • pycharm新建python file没有默认头_Pycharm 设置默认头的图文教程

    pycharm新建python file没有默认头_Pycharm 设置默认头的图文教程Pycharm 设置默认头的图文教程 1 设置的路径是 File gt settings gt Editor gt FileandCodeT gt PythonScript 内容见图 这样新建文件的时候就会默认头如下 这里说明下 usr bin evnpython 和 usr bin python 的区别 第一种写法是在 PC 的 Path 中找寻第一个 python

    2026年3月17日
    1
  • 软件缺陷,缺陷报告怎么写_缺陷报告通常包括哪些内容

    软件缺陷,缺陷报告怎么写_缺陷报告通常包括哪些内容软件缺陷软件缺陷:常常又被叫做Bug。所谓软件缺陷,即为计算机软件或程序中存在的某种破坏正常运行能力的问题、错误,或者隐藏的功能缺陷。缺陷的存在会导致软件产品在某种程度上不能满足用户的需要。从软件测试观点出发,软件缺陷有以下五大类:功能缺陷、系统缺陷、加工缺陷、数据缺陷、代码缺陷软件类别:缺陷的表现形式不仅体现在功能的失效方面,还体现在其他方面。主要类型有:软件没有实现产品规格说明所…

    2026年1月20日
    5
  • Java常用开发工具有哪些?

    Java常用开发工具有哪些?Java常用的几个开发工具。下面这些工具或许功能和作用不同,但是有着一个共同的主旨,那就是——它们都是为了给Java编码和开发提供卓越的支持。常用源码编辑工具介绍Java源代码本质上其实就是普通的文本文件,所以理论上来说任何可以编辑文本文件的编辑器都可以作为我们的Java代码编辑工具。比如:Windows记事本,MacOSX下的文本编辑,Linux下的vi、emacs、gedit、DOS下的edit等。但是这些简单工具没有语法的高亮提示、自动完成等功能,这些功能的缺失会大.

    2022年7月7日
    29
  • java中string转object_java中Object转String

    java中string转object_java中Object转StringObject转为String的几种形式在java项目的实际开发和应用中,常常需要用到将对象转为String这一基本功能。本文将对常用的转换方法进行一个总结。常用的方法有Object.toString(),(String)要转换的对象,String.valueOf(Object)等。下面对这些方法一一进行分析。方法1:采用Object.toString()方法请看下面的例子:Objectobje…

    2022年6月11日
    414

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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