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

微服务建议:每个微服务采用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 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 requestHTTP请求对象,即构建的HttpEntity对象
Class 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对象
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值