简单微服务调用-模板类RestTemplate

2019-01-07  本文已影响0人  wingedsnake

微服务建议:每个微服务采用REST风格的URI请求给别的微服务系统使用。Spring框架提供了一个模板类RestTemplate来方便我们对REST请求进行操作。该类放在org.springframework.web.client包下(对应spring-web-**.jar下)。
首先记录一点:模板类RestTemplate底层是通过类HtppURLConnection实现的。
RestTemplate中有GET、POST、DELETE等相关REST风格的请求方法
例1:通过GET请求从远程服务器端REST接口

public static UserInfo getUserInfo(Long id){
  RestTemplate restTmpl = new RestTemplate();
  //调用getForObject方法,请求远程服务端REST接口
  UserInfo userInfo = restTmpl.getForObject("http://127.0.0.1:8080/user/{id}",UserInfo.class,id);
  return userInfo;
}

getForObject有以下几个重构方法

//重构方法1
getForObject(String url, Class<T> responseType, Object... uriVariables)
//重构方法2
getForObject(String url, Class<T> responseType, Map<String, ?> uriVariables)
//重构方法3
getForObject(URI url, Class<T> responseType)
参数名 解释
String url 指定要请求的url地址
Class<T> responseType 指定响应类型(请求的url地址返回的对象类型[实际返回的为JSON对象,指定对应的响应对象后RestTemplate对象底层会自行转换成指定对象])
Object... uriVariables 可变参数,指定请求url地址的参数
Map<String, ?> uriVariables 指定请求url地址的参数,参数过多时可用Map对象包装后传递参数

例2:通过POST请求从远程服务器端REST接口

public static User insertUser(UserInfo newUserInfo){
  //创建请求头对象
  HttpHeaders headers = new HttpHeaders();
  //设置请求头中'ContentType'值为JSON格式,字符编码为UTF-8
  headers.setContentType=(MediaType.APPLICATION_JSON_UTF8);
  //创建HTTP请求对象,传入请求头和请求体
  HttpEntity<UserInfo> request = new HttpEntity<>(newUserInfo,headers);
  RestTemplate restTmpl = new RestTemplate();
  //调用restTemplate对象的postForObject方法,请求远程服务端的REST接口
  User user = restTmpl.postForObject("http://127.0.0.1:8080/user",request,User.class);
  return user;
}

postForObject有以下几个重构方法

//重构方法1
postForObject(String url, @Nullable Object request, Class<T> responseType,Object... uriVariables)
//重构方法2
postForObject(String url, @Nullable Object request, Class<T> responseType,Map<String, ?> uriVariables)
//重构方法3
postForObject(URI url, @Nullable Object request, Class<T> responseType)
参数名 解释
String url 指定要请求的url地址
Object request HTTP请求对象,即构建的HttpEntity对象
Class<T> responseType 指定响应类型(请求的url地址返回的对象类型[实际返回的为JSON对象,指定对应的响应对象后RestTemplate对象底层会自行转换成指定对象])
Object... uriVariables 可变参数,指定请求url地址的参数
Map<String, ?> uriVariables 指定请求url地址的参数,参数过多时可用Map对象包装后传递参数

例3:通过DELETE请求从远程服务器端REST接口

public static void delete(Long id){
  RestTemplate restTemplate = new RestTemplate();
  //通过delete方法,请求远程服务端的REST接口
  restTemplate.delete("http://127.0.0.1:8080/user/{id}",id);
}

delete有以下几个重构方法

//重构方法1
delete(String url, Object... uriVariables)
//重构方法2
delete(String url, Map<String, ?> uriVariables)
//重构方法3
delete(URI url)
参数名 解释
String url 指定要请求的url地址
Object... uriVariables 可变参数,指定请求url地址的参数
Map<String, ?> uriVariables 指定请求url地址的参数,参数过多时可用Map对象包装后传递参数
URI url 通过封装URI对象请求远程服务端REST接口

PUT相关方法使用方法与POST类似,只是调用的是put方法。就不做重复性笔记了。
在JDK的HttpURLConnection中并没有能够支持PATCH请求,spring目前只预留这样的机制。
重点以上几个方法归结起来就是一个exchange方法。
例4:通过exchange请求从远程服务器端REST接口

public static User userExchange(UserInfo userInfo,Long id){
  //创建请求头对象
  HttpHeaders headers = new HttpHeaders();
  //设置请求头中'ContentType'值为JSON格式,字符编码为UTF-8
  headers.setContentType=(MediaType.APPLICATION_JSON_UTF8);
  //封装请求头和请求体为Http请求对象
  HttpEntity<UserInfo> request = new HttpEntity<>(userInfo,headers);
  RestTemplate restTmpl = new RestTemplate();
  //调用restTemplate对象的exchange方法,用POST请求远程服务端的REST接口
  ResponseEntity<User> userEntity = restTmpl.exchange("http://127.0.0.1:8089/entity",HttpMethod.POST,request,User.class);
  //获取响应体
  User user = userEntity.getBody();
  //获取响应头
  HttpHeaders headers = userEntity.getHeaders();
  //获取响应头SUCCESS属性
  List<String> success = headers.get("SUCCESS");
  //调用restTemplate对象的exchange方法,用GET请求远程服务端的REST接口
  ResponseEntity<User> userEntity = restTmpl.exchange("http://127.0.0.1:8089/entity",HttpMethod.GET,null,User.class,id);
  //获取响应体
  User user = userEntity.getBody();
  return user;
}

更多关于exchange方法暂无测试,使用时再查API使用。
一般采用更具语义化的调用方法: postForObject、getForObject、delete等可读性易用性更高,不过exchange方法更灵活。


补充:

POST、GET还有对应的postForEntity、getForEntity两个方法。入参的方式与postForObject、getForObjec两个方法t相同。两个方法均返回responseEntity<T>对象,ResponseEntity<T>继承了HttpEntity<T>类。
ResponseEntity<T>类中几个常用API方法(含HttpEntity<T>类中常用的方法)如下

方法名 方法解释
getStatusCode 返回对应的状态代码,返回一个HttpStatus对象
getStatusCodeValue 返回对应的状态代码值[int类型]
getBody 返回响应体对象,响应体对象同泛型中对象一致
getHeaders 获取请求头,返回HttpHeaders对象
上一篇下一篇

猜你喜欢

热点阅读