使用RestTemplateUtils.java调用多个第三方接口,二次封装成新接口。
目的:通过Spring的RestTemplate,调用整合多个第三方接口,输出一个接口,以提高数据构造效率。
选择这个方式的原因,RestTemple是前三种方式的集大成者,代码编写更加简单。 各种方式对比
两个文件搞定二次封装第三方接口,提效造数!!~~
1、导包-最后导也行缺啥加啥
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.51</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
2、新建工具类文件-RestTemplateUtils.java
直接CV,放到项目工具类里面就行,唯一需要改的就是路径什么的用自己项目的就行。
工具类文件代码
3、在Controller中新建.java文件,直接使用
这个例子中,原接口有两个,一个创建商品数据post,一个审核商品数据get,我们整合后就只用调用一个接口生成所需数据。
过程中,把原接口中很多无关紧要的参数写为固定值,直接使用所需的最终数据,已提升数据构造效率。
原接口1: 创建商品原接口post
curl --location 'http://localhost/addPyGoods' \
--header 'empno: 12345' \
--header 'Content-Type: application/json' \
--data '{
"BaseReq": {
"cityId": "010",
"name": "商品名称"
},
"ClassReq": {
"classIdList": [
"123456"
]
}
}'
返回
{
"rlt": true,
"message": "操作成功!",
"code": "000000",
"data": "123456"
}
原接口2: 审核商品原接口get
curl --location 'https://localhost/auditGoods?
goodsId=123456&actionStatus=1-0'\
创建审核一体 新接口get
curl --location 'http://localhost/Goods/newaddGood?
classList=123,2C456' \
--header 'Connection: keep-alive'
Controller代码如下
package com.tools.createclass.controller; //自己的路径可忽略
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.tools.api.entity.response.Response;
import org.springframework.web.bind.annotation.*;
import java.util.*;
import com.tools.createclass.config.RestTemplateUtils; //我们要用的工具类
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
/**
* @ClassName : GoodsController
* @Description :通过RestTemplateUtils调用第三方接口,创建商品数据
* @Author : zxy
* @Date: 2023
*/
@RestController
@RequestMapping("/Goods")
public class GoodsController {
//test
@GetMapping(value = "test")
public Response<Object> test() {
System.out.println("test一下");
return Response.success("返回ok测试");
}
//添加商品
@GetMapping(value = "newaddGood")
public Response<Object> addGood(@RequestParam Map<String,Object> params) {
//System.out.println(params);
//明确新接口入参数,需要自定义的只有班级id,所以就只需要填写班级id
//入参数 接口重新封装
String classListStr=String.valueOf(params.get("classList")); //入参数取班级id数组
List<String> classList = Arrays.asList(classListStr.split(",")); //字符串转列表
//新增商品接口post
//url
String url="http://localhost/addPyGoods";
//System.out.println("【url】:"+url);
//header 拼接
HttpHeaders headers = new HttpHeaders();
headers.set("content-type","application/json;charset=UTF-8");
headers.set("empno","12345"); //创建人写死
//System.out.println("【headers】:"+headers);
//json 拼接
JSONObject json=new JSONObject();
// 1、addPyGoodsClassReq替换classid 使用入参param中取的的classList
String str1="{\"classIdList\": "+JSON.toJSONString(classList)+"}"; //list转json,JSON.toJSONString(classList)
JSONObject ClassReq=JSONObject.parseObject(str1);
// 2、addPyGoodsBaseReq内容使用默认值
String str2="{\"cityId\": \"010\",\"name\": \"商品名称\"}";
JSONObject BaseReq = JSONObject.parseObject(str2);
json.put("ClassReq",ClassReq);
json.put("BaseReq",BaseReq);
//System.out.println("【json】"+json);
//请求第三方接口 url,headers,json,返回string
ResponseEntity<String> responseEntity= RestTemplateUtils.post(url, headers, json,String.class);
//System.out.println("【responseEntity】"+responseEntity);
if (responseEntity.getStatusCode() != HttpStatus.OK) {
// log.error("doSendPost status error, url: {}, status: {}", url, responseEntity.getStatusCode());
return Response.success("调用第三方接口失败,请稍后再试");
}
//接收创建商品接口返回体 转为json方便取值
String result=responseEntity.getBody();
JSONObject resultJson = JSONObject.parseObject(result);
//取出创建接口返回的商品id
String data=resultJson.getString("data");
//System.out.println("视频号商品ID"+data);
if (data == null){
//创建失败
return Response.success(resultJson);
}
//审核一下,入参数商品id------------------------------------------------------------------------------------------------------
//审核商品接口get
//url
String url_Audit="http://master-course-beta.speiyou.com/bedrock-course/pyGoodsBase/auditGoods?"+params_Audit;
//System.out.println("【url_Audit】:"+url_Audit);
//header 拼接
HttpHeaders headers_Audit = new HttpHeaders();
headers_Audit.set("content-type","application/json;charset=UTF-8");
//System.out.println("【headersAudit】:"+headers_Audit);
//params_Audit入参数 拼接
String params_Audit="goodsId="+data+"&actionStatus=1-0";
//System.out.println("【params_Audit】:"+params_Audit);
//请求第三方接口 url,headers,json,返回string
ResponseEntity<String> responseEntity_Audit= RestTemplateUtils.get(url_Audit, headers_Audit,String.class);
//System.out.println("【responseEntity_Audit】"+responseEntity_Audit);
if (responseEntity.getStatusCode() != HttpStatus.OK) {
// log.error("doSendPost status error, url: {}, status: {}", url, responseEntity.getStatusCode());
return Response.success("调用第三方接口失败,请稍后再试");
}
//返回最后结果
return Response.success(resultJson);
}
}