最近看到spring RestTemplate,觉得挺好用的,就研究总结了一下,第一次写。。。
RestTemplate可使用http的所有方式进行请求,本文主要说明下get,post的使用,其他的基本类似。
spring RestTemplate中直接使用get方法有两种getForObject和getForEntity
每种方式都有3个重载方法
public class User {
private String name;
private Integer age;
private RestTemplate restTemplate = new RestTemplate();
private String name = "xiaoming";
private Integer age = 18;
getForObject
发送方
String url = "http://localhost:8080/getUser?name={name}&age={age}";
Object[] arr = new Object[]{name, age};
User u = restTemplate.getForObject(url, User.class, arr);
或
String url = "http://localhost:8080/getUser?name={name}&age={age}";
Map<String, Object> map = new HashMap<>();
map.put("name", name);
map.put("age", age);
User u = restTemplate.getForObject(url, User.class, map);
接收方
public User get1(@RequestParam String name, @RequestParam Integer age)
getForEntity与getForObject请求参数基本一样,只是返回内容不一样
ResponseEntity getForEntity(String url, Class responseType, Object… urlVariables)
getForEntity返回ResponseEntity,里面包含返回消息内容和http headers,http 状态码,如下例
String url = "http://localhost:8080/getUser?name={name}&age={age}";
Map<String, Object> map = new HashMap<>();
map.put("name", name);
map.put("age", age);
ResponseEntity res = restTemplate.getForEntity(url, User.class, map);
User u = res.getBody();
HttpHeaders headers = res.getHeaders();
HttpStatus status = res.getStatusCode();
以上是RestTemplate的get请求使用方式,对于get请求传送head信息的,实现在下面说到
post方法主要有3种方法:postForObject, postForEntity和postForLocation
同样有3种重载
private HttpEntityRequestCallback(Object requestBody, Type responseType) {
super(responseType);
if (requestBody instanceof HttpEntity) {
this.requestEntity = (HttpEntity>) requestBody;
}
else if (requestBody != null) {
this.requestEntity = new HttpEntity
可以看到Object request最终都会转换为HttpEntity,httpEntity类中如下
public class HttpEntity<T> {
/**
* The empty {@code HttpEntity}, with no body or headers.
*/
public static final HttpEntity> EMPTY = new HttpEntity
主要包含headers和body两部分内容,如果Object request可直接转为HttpEntity,则可直接使用,否则默认为HttpEntity中body的内容
参数传递,这种post方式可以避开get方法参数过长的影响,不限制参数长度
String url = "http://localhost:8080/getUser";
LinkedMultiValueMap<String, Object> map = new LinkedMultiValueMap<>();
map.add("name", name);
map.add("age", age);
User u = restTemplate.postForObject(url, map, User.class);
或
String url = "http://localhost:8080/getUser";
LinkedMultiValueMap<String, Object> map = new LinkedMultiValueMap<>();
map.add("name", name);
map.add("age", age);
HttpEntityString, Object>> httpEntity = new HttpEntity<>(map);
User u = restTemplate.postForObject(url, httpEntity, User.class);
接收方
public User get1(@ModelAttribute User user)
传递http head信息,可自行设置http请求的head信息
发送方
String url = "http://localhost:8080/getUser";
LinkedMultiValueMap<String, Object> map = new LinkedMultiValueMap<>();
map.add("name", name);
map.add("age", age);
HttpHeaders headers = new HttpHeaders();
headers.add("msg", "head msg test");
HttpEntityString, Object>> httpEntity = new HttpEntity<>(map, headers);
User u = restTemplate.postForObject(url, httpEntity, User.class);
接收方
@RequestMapping(value = "/getUser", method = {RequestMethod.POST})
public User get1(@RequestParam String name, @RequestParam Integer age, @RequestHeader(required = false) String msg)
postForEntity返回ResponseEntity,与getForEntity相同
postForLocation返回URI,返回的是response header中的location信息,一般用于资源定位。
spring直接提供了所有http的请求的公用方法exchange,简单介绍下
ResponseEntity exchange(String url, HttpMethod method,
HttpEntity< ?> requestEntity, Class responseType, Object… uriVariables)
参数设置基本相同,多了个HttpMethod ,设置http的请求方式,通过这个就可以设置Http Get方式的头信息