微服务建议:每个微服务采用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对象 |
网友评论