RestTemplate调接口其实就是用RestTemplate 相应的方法做CRUD,但是不知道为啥我做的时候就不顺,所以也是一个人大门不出二门不迈在家写了个demo研究一下
总体脉络还是按GET POST DELET PUT 把每种情况说一下吧(其实本人也是菜鸟一枚,不足之处请多多指正!)
所调用接口统一都是这样的(可能不带参数):
String src = "http://localhost:8082/sys/sendmessagecode/sendcode?phoneNumber="+phoneNumber;
(一)GET
1:不带参数的
我这个是用getForEntity调用的(代码如下),因为是GET肯定不能用postForObject()这种post开头的方法。也可以用
new RestTemplate().execute()或new RestTemplate().exchange()这种来调用
public List<SysUser> face() {
String src = "http://localhost:8082/sys/user/jk";
ResponseEntity<List> forEntity = new RestTemplate().getForEntity(src, List.class);
List<SysUser> body = forEntity.getBody();
System.out.println(body);
return body;
}
2:带参数的(String str,String type)这种的(代码如下)
这种需要特别注意:拼接参数时直接用代码在
? phoneNumber="+phoneNumber;
正确代码如下:
@RequestMapping(value = "/facecheck",method = RequestMethod.GET)
public Map<String,Object> face(@RequestParam(value = "phoneNumber",required = false) String phoneNumber) {
String src = "http://localhost:8082/sys/sendmessagecode/sendcode? phoneNumber="+phoneNumber;
ResponseEntity<Map> exchange = new RestTemplate().exchange(src, HttpMethod.POST, HttpEntity.EMPTY, Map.class);
return exchange.getBody();
}
这种,不能先写http://localhost:8082/sys/sendmessagecode/sendcode再利用其他类似于MultiValueMap来拼接(反正我是没有成功,可能我太菜了)
MultiValueMap<String,Object> map = new LinkedMultiValueMap<String,Object>();
map.add("phoneNumber",phoneNumber);
(二)POST
这种只介绍参数时实体对象的(代码如下)(当然其他调用方法也有很多)
@RequestMapping(value = "/facecheck",method = RequestMethod.GET)
public SysUser face(@RequestParam(value = "phoneNumber",required = false) String phoneNumber) {
String src = "http://localhost:8082/sys/user/saveListSys";
SysUser sysUser =new SysUser();
sysUser.setUserName("kllol");
sysUser.setSex("njnj");
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
HttpEntity httpEntity = new HttpEntity(sysUser,headers);
ResponseEntity<SysUser> forEntity = new RestTemplate().postForEntity(src,httpEntity, SysUser.class);
return forEntity.getBody();
}
如果参数是(String str,String type) 这种可以拼接成这样:
String src = "http://localhost:8082/sys/sendmessagecode/sendcode?phoneNumber="+phoneNumber;
(三)DELETE
用new RestTemplate().delete 方法(代码如下)
@ApiOperation(value = "人脸识别",notes = "人脸识别")
@RequestMapping(value = "/facecheck",method = RequestMethod.GET)
public void face(@RequestParam(value = "id",required = true) String id) {
String src = "http://localhost:8082/sys/user/deleteListSys/{id}?id="+id;
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
HttpEntity httpEntity = new HttpEntity(null,headers);
new RestTemplate().delete(src,id);
}
(四)PUT
这里和DELETE 差不多用 new RestTemplate().put 方法调用。所以不再赘述
(五)返回值问题以及HttpEntity问题
MultiValueMap<String,Object> map = new LinkedMultiValueMap<String,Object>();
map.add("phoneNumber",phoneNumber);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
headers.add("Accept", "application/json");//请求头
HttpEntity<MultiValueMap<String,Object>> httpEntity = new HttpEntity(headers,map);
(1)如果你代码中设置了HttpEntity , HttpEntity<MultiValueMap<String,Object>> httpEntity = new HttpEntity(headers,map);这里hearders,map没有可以直接在里面写null或者一个写一个不写。但是返回值肯定是
ResponseEntity<Map> forEntity = new RestTemplate().postForEntity(src,httpEntity, Map.class);
用ResponseEntity接收的返回值
(2)类似于这种方法中有HttpEntity<?> httpEntity (代码如下)
<T> org.springframework.http.ResponseEntity<T> exchange(java.lang.String s, org.springframework.http.HttpMethod httpMethod, @org.springframework.lang.Nullable org.springframework.http.HttpEntity<?> httpEntity, java.lang.Class<T> aClass, java.lang.Object... objects) throws org.springframework.web.client.RestClientException;
如果实际不需要httpEntity 则可以写为 HttpEntity.EMPTY