个人笔记:调用其他系统接口相关知识
RestTemplateClient 调用工具类:
@Component
public class RestTemplateClient {
// @Autowired
// private RestTemplate restTemplate;
public JSONObject restTemplateByEntity (String url, Object entity){
String resultInfo = "";
RestTemplate restTemplate = new RestTemplate();
this.changeCharset(restTemplate);
HttpHeaders headers = new HttpHeaders();
MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
headers.setContentType(type);
headers.add("Accept", MediaType.APPLICATION_JSON.toString());
ObjectMapper objectMapper = new ObjectMapper();
HttpEntity<String> Object = null;
JSONObject jsonObject = null;
try {
// String resultInfo = restTemplate.getForObject(url, String.class, itemCode);
Object = new HttpEntity<>(objectMapper.writeValueAsString(entity), headers);
resultInfo = restTemplate.postForEntity(url, Object, String.class).getBody();
jsonObject = JSONObject.parseObject(resultInfo);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return jsonObject;
}
public String restTemplateByEntityWithParam (String url, Object entity, Map<String, Object> map){
String resultInfo = "";
RestTemplate restTemplate = new RestTemplate();
this.changeCharset(restTemplate);
// 获取新ibus的头信息
HttpHeaders headers = this.getNewIbusRestHeaders(map);
ObjectMapper objectMapper = new ObjectMapper();
HttpEntity<String> Object = null;
// JSONObject jsonObject = null;
try {
// String resultInfo = restTemplate.getForObject(url, String.class, itemCode);
Object = new HttpEntity<>(objectMapper.writeValueAsString(entity), headers);
resultInfo = restTemplate.postForEntity(url, Object, String.class).getBody();
// jsonObject = JSONObject.parseObject(resultInfo);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return resultInfo;
}
/**
* 针对srm接收参数 有 "\" 解析参数失败问题
* @param url
* @param entity
* @param map
* @return
*/
public String restTemplateByEntityWithParam1 (String url, String entity, Map<String, Object> map){
String resultInfo = "";
RestTemplate restTemplate = new RestTemplate();
this.changeCharset(restTemplate);
// 获取新ibus的头信息
HttpHeaders headers = this.getNewIbusRestHeaders(map);
ObjectMapper objectMapper = new ObjectMapper();
HttpEntity<String> Object = null;
Object = new HttpEntity<>(entity, headers);
resultInfo = restTemplate.postForEntity(url, Object, String.class).getBody();
return resultInfo;
}
public JSONObject restTemplateByString (String url, String value){
String resultInfo = "";
RestTemplate restTemplate = new RestTemplate();
this.changeCharset(restTemplate);
HttpHeaders headers = new HttpHeaders();
MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
headers.setContentType(type);
headers.add("Accept", MediaType.APPLICATION_JSON.toString());
ObjectMapper objectMapper = new ObjectMapper();
HttpEntity<String> Object = null;
JSONObject jsonObject = null;
resultInfo = restTemplate.getForObject(url, String.class, value);
jsonObject = JSONObject.parseObject(resultInfo);
return jsonObject;
}
/**
* 中文转码
* @param restTemplate
*/
public void changeCharset(RestTemplate restTemplate){
List<HttpMessageConverter<?>> httpMessageConverters = restTemplate.getMessageConverters();
httpMessageConverters.stream().forEach(httpMessageConverter -> {
if(httpMessageConverter instanceof StringHttpMessageConverter){
StringHttpMessageConverter messageConverter = (StringHttpMessageConverter) httpMessageConverter;
//设置编码为UTF-8
messageConverter.setDefaultCharset(Charset.forName("UTF-8"));
}
});
}
public HttpHeaders getNewIbusRestHeaders(Map<String, Object> map) {
HttpHeaders headers = new HttpHeaders();
MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
headers.setContentType(type);
headers.add("Accept", MediaType.APPLICATION_JSON.toString());
String basicAuthUsername = map.get("basicAuthUsername") != null ? String.valueOf(map.get("basicAuthUsername")) : "";
String basicAuthPassword = map.get("basicAuthPassword") != null ? String.valueOf(map.get("basicAuthPassword")) : "";
String reqId = map.get("reqId") != null ? String.valueOf(map.get("reqId")) : "";
String reqFrom = map.get("reqFrom") != null ? String.valueOf(map.get("reqFrom")) : "";
if (StringUtils.isNotBlank(basicAuthUsername) && StringUtils.isNotBlank(basicAuthPassword)) {
String userNameAndPassword = basicAuthUsername + ":" + basicAuthPassword;
headers.set("authorization",
"Basic " +
Base64.getEncoder()
.encodeToString(userNameAndPassword.getBytes()));
}
if (StringUtils.isNotBlank(reqId)) {
headers.add("reqId", reqId);
}
if (StringUtils.isNotBlank(reqFrom)) {
headers.add("reqFrom", reqFrom);
}
return headers;
}
}
具体实现示例
SUPPLYPAYMENTPOLICYMANAGEMENT_UPDATE_URL为post接口,返回数据为列表时,提供服务的系统为DDD架构,返回数据为result封装后的list对象:
String url = VendorUrlConstant.SELECT_SUPPLY_BASE_INFO_LIKE;
JSONObject jsonObject = restTemplateClient.restTemplateByEntity(url, supplyBaseInfoDto);
if (jsonObject.get("code").toString().equals("0")) {
String data = jsonObject.getString("data");
List<SupplyBaseInfoDto> supplyBaseInfoDtos = (List<SupplyBaseInfoDto>) JSONArray.parseArray(data, SupplyBaseInfoDto.class);
}
//或者
String url = VendorUrlConstant.SUPPLYPAYMENTPOLICYMANAGEMENT_UPDATE_URL;
JSONObject jsonObject = restTemplateUtils.restTemplateByEntity(url, ouList);
if(jsonObject.get("code").toString().equals("0")){
String data = jsonObject.getString("data");
Gson gson = new Gson();
//将字符串转为对象list
erp12List = gson.fromJson(data, new TypeToken<List<SupplyErp12InfoDto>>() {}.getType());
}
TypeToken是一个匿名内部类,官方解释:Gson提供了TypeToken这个类来帮助我们捕获像list这样的泛型信息。java编译器就会把捕获到的泛型信息编译到这个匿名内部类中,然后再运行时就会被getType()方法用反射的API提取到。其实就是将T转成.class。
使用JSONArray类的JSONArray.parseArray(data, Demo.Class)方法,可以将字符串转成对象List;JSON.parseObject()将str转为对象。
get接口示例:
public List<FndVendorSitesDto> getBySupplyIdAndOuId(String supplyId, String ouId) {
// 先根据ouId取出ouCode
List<FndBusinessUnits> fndBusinessUnitsList = fndBusinessUnitsMapper.getOUByBusinessUnitId(ouId);
String ouCode = "";
if (fndBusinessUnitsList != null && fndBusinessUnitsList.size() > 0) {
ouCode = fndBusinessUnitsList.get(0).getBusinessUnitCode();
}
List<FndVendorSitesDto> sitesDtoList = new ArrayList<>();
// 去中台取ou和地点信息表
OuAndAddressInformationDto ouAndAddressInformationDto = new OuAndAddressInformationDto();
ouAndAddressInformationDto.setSupplyId(supplyId);
ouAndAddressInformationDto.setOuCode(ouCode);
String url = VendorUrlConstant.OUANDADDRESSINFO_SELECT;
JSONObject jsonObject = restTemplateClient.restTemplateByEntity(url, ouAndAddressInformationDto);
if (jsonObject.get("code").toString().equals("0")) {
String data = jsonObject.getString("data");
List<OuAndAddressInformationDto> dtoList = JSONArray.parseArray(data, OuAndAddressInformationDto.class);
// 创建FndVendorSitesDto
for(OuAndAddressInformationDto dto : dtoList){
FndVendorSitesDto fndVendorSitesDto = new FndVendorSitesDto();
//xxx
sitesDtoList.add(fndVendorSitesDto);
}
}
return sitesDtoList;
}
直接调用其他系统的api接口实例
A系统被调用接口,代码如下:
@RequestMapping("/srmSyncData")
public RestResponse srmSyncData(@RequestBody List<RequestPricePlatformDto> list){
ObjectMapper objectMapper = new ObjectMapper();
List<RequestPricePlatformDto> list1 = new ArrayList<>(list);
List<RequestPricePlatformDto> returnList = new ArrayList<>(list);
String failReason = "";
......
} catch (Exception e) {
e.printStackTrace();
return RestResponse.error().put("data", returnList);
}
return RestResponse.success().put("data", returnList);
B系统 调用方接口逻辑
//创建请求头
HttpHeaders headers = new HttpHeaders();
MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
headers.setContentType(type);
headers.add("Accept", MediaType.APPLICATION_JSON.toString());
String url = "http://" + IosServiceProperties.getPriceHost() + ":8888/platform-plus/ladderPrice/pricePlatform/srmSyncData";
JSONObject jsonObject = restTemplateClient.restTemplateByEntity(url, list);
if(jsonObject.get("code").toString().equals("0")){
String data = jsonObject.getString("data");
Gson gson = new Gson();
priceResDtoList = gson.fromJson(data, new TypeToken<List<RequestPricePlatformItfDto>>() {}.getType());
}
......
未完待续…