调用其他人提供的API的参考链接:https://www.baeldung.com/rest-template
下面代码是对于JSON字符串格式为这种的: {"Table":[{"name":"a1","code":"aaa"},{"name":"b1","code":"bbb"}]}
1、
@GetMapping("/getAll")
private List<Smcorp> getAll() throws JsonProcessingException {
//调用接口的链接
final String url = "http://xxx.xxx.x.x:xxxx/api/xxxxx/GetAll";
RestTemplate restTemplate = new RestTemplate();
//获取API返回值
String forObject = restTemplate.getForObject(url, String.class);
List<Smcorp> smcorps = new ArrayList<>();
if (forObject != null) {
//如果JSON字符串里面有换行符等,需要去掉,要不然会报错
forObject = forObject.replaceAll("[\b\r\n\t]*", "");
//也可以用substring截取数组那一段,速度会比下面这个方法快
Object table = new JSONObject(forObject).get("Table");
//忽略那些映射不对应的字段
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
//字符串形式的对象数组转成实体类对象集合
smcorps = new ObjectMapper().readValue(table.toString(), new TypeReference<List<Smcorp>>() { }); } return smcorps; }
本地建立一个实体类与第三方数据库返回的Json数据与之对应
public class Gldocs { @JsonIgnore//把该实体类的数据返回前端时,这个字段不序列化成json返回前端,即前端拿不到这个字段 @JsonProperty("CORPTYPE")//序列化成JSON时的名字,前端调用是调用这个名字CORPTYPE private String corpType; @JsonProperty("SDOC_ID") private String sdocId; public String getCorpType() { return corpType; } public void setCorpType(String corpType) { this.corpType = corpType; } public String getSdocId() { return sdocId; } public void setSdocId(String sdocId) { this.sdocId = sdocId; } }
2、
@GetMapping("/getAll")
private List<Smcorp> getAll2() throws JsonProcessingException {
//调用接口的链接
final String url = "http://xxx.xxx.x.x:xxxx/api/xxxx/GetAll";
RestTemplate restTemplate = new RestTemplate();
//获取API返回值
String forObject = restTemplate.getForObject(url, String.class);
List<Smcorp> smcorps = new ArrayList<>();
if (forObject != null) {
//用substring截取数组字符串
forObject=forObject.substring(9, forObject.length() - 1);
//如果JSON字符串里面有换行符等,需要去掉,要不然会报错
forObject = forObject.replaceAll("[\b\r\n\t]*", "");
//字符串形式的对象数组转成实体类对象集合
smcorps = new ObjectMapper().readValue(forObject , new TypeReference<List<Smcorp>>() {
});
}
return smcorps;
}
3、
@GetMapping("/getAll")
private List<Smcorp> getAll2() throws JsonProcessingException {
//调用接口的链接
final String url = "http://xxx.xxx.x.x:xxxx/api/xxxx/GetAll";
RestTemplate restTemplate = new RestTemplate();
//获取API返回值
String forObject = restTemplate.getForObject(url, String.class);
List<Smcorp> smcorps = new ArrayList<>();
if (forObject != null) {
//如果JSON字符串里面有换行符等,需要去掉,要不然会报错
forObject = forObject.replaceAll("[\b\r\n\t]*", "");
}
//把字符串转成JSONObject
JSONObject jsonObject = new JSONObject(forObject);
//通过key拿到JSONArray
JSONArray table = jsonObject.getJSONArray("Table");
//把JSONArray转成List<Object>
List<Object> objects = table.toList();
//把List<Object>转成实体类对象集合
smcorps = objects.stream().map(x -> new ObjectMapper().convertValue(x, Smcorp.class)).collect(Collectors.toList());
return smcorps;
}
速度最快的是第2种方法,然后是第一种。直接用 substring截取最快,用这个 new ObjectMapper().readValue(forObject , new TypeReference<List<Smcorp>>() })把字符串形式的对象数组转成实体类集合也很快。
4、调用接口传参,使用map设置好键值对,再调用RestTemplate
String url = "http://xx.xxx.x.xx:xxxx/api/xxxx/xxxx/corptype={corptype}&SCORPCODE={scorpcode}&SACC_CODE_C={saccCodeC}&SPERIODCODE={speriodCode}"; HashMap<String, String> map = new HashMap<>(); map.put("corptype", corptype); map.put("scorpcode", scorpcode); map.put("saccCodeC", saccCodeC); map.put("speriodCode", speriodCode); RestTemplate restTemplate = new RestTemplate(); String forObject = restTemplate.getForObject(url, String.class, map);
