概述
RestTemplate 是一个 Spring 提供的,Web模块内带的用于实现RestFul 请求的客户端,底层默认是适用java.net
来创建http请求。
方法
getForEntity&&getForObject
getForEntity
是实现Get请求的常规方法之一,该方法提供了三种不同的重载实现。
- getForEntity(String url, Class
responseType, Object… uriVariables)
该方法第一个参数为请求地址,第二个为相应中body的包装类型或序列化类型,最后一个为url中的参数绑定,具体使用如下:
RestTemplate restTemplate = new RestTemplate();
String url = "http://localhost?param1={1}¶m2={2}";
ResponseEntity<String> responseEntity = restTemplate.getForEntity(url, String.class, "value1", "value2");
- getForEntity(String url, Class
responseType, Map<String, ?> uriVariables)
该方法前两个参数与上一方法参数相同,最后一个为绑定url中的参数Map,具体使用如下:
RestTemplate restTemplate = new RestTemplate();
String url = "http://localhost?param1={param1}";
MultiValueMap<String, String> paramMap = new LinkedMultiValueMap<>();
paramMap.put("param1", "value1");
ResponseEntity<String> responseEntity = restTemplate.getForEntity(url, String.class, paramMap);
- getForEntity(URI url, Class
responseType)
该方法第一个参数为java.net底下的URI对象,在该方法中用于指定请求地址和绑定URL参数,具体使用方法如下:
RestTemplate restTemplate = new RestTemplate();
URI uri = UriComponentsBuilder.fromHttpUrl("http://localhost").queryParam("param1", "value1").build(true).toUri();
ResponseEntity<String> forEntity = restTemplate.getForEntity(uri, String.class);
getForObject
是getForEntity
的进一步封装,使用HttpMessageConverterExtractor对响应体内的body内容进行反序列化转换为实体,请求返回包装好的对象类型,以下以URI绑定参数做示例,其他两种方式类推:
URI uri = UriComponentsBuilder.fromHttpUrl("http://localhost").queryParam("param1", "value1").build(true).toUri();
String object = restTemplate.getForObject(uri, String.class);
postForEntity&&postForObject
同样的,POST请求也提供了三个常规的请求方法,使用方式与GET请求大同小异,不同的在于POST请求一般除了URL上参数外,还带有请求体(上面的GET请求常规方法默认不带请求体,假如需要带的话则要使用更底层的方法,如后面介绍的exchange
方法),故参数上会较之会多一个,该参数为Object类型的参数request,代表了POST请求的请求体(如POST请求是涉及到上传文件形式的,则需使用更通用的exchange
方法)。
- postForEntity(String url, Object request, Class
responseType, Object… uriVariables):
RestTemplate restTemplate = new RestTemplate();
String url = "http://localhost/user?param1={1}";
User requestBody = new User();
restTemplate.postForEntity(url, requestBody, String.class, "value1");
**注:**这里的requst参数可以是普通的非 HttpEntity 对象,此时会自动转化为 HttpEntity 对象处理,而手动传入 HttpEntity 对象可以加入额外的请求头信息,具体使用如下:
...
MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
headers.put("User-Agent", Collections.singletonList("HttpClient"));
HttpEntity<User> request = new HttpEntity<>(new User(), headers);
restTemplate.postForEntity(url, request, String.class, "value1");
- postForEntity(String url, Object request, Class
responseType, Map<String, ?> uriVariables)
使用方法联系getForEntity(...)
及第一个postForEntity(...)
的使用方法类推即可。
- postForObject(URI url, Object request, Class
responseType)
使用方法联系getForEntity(...)
及第一个postForEntity(...)
的使用方法类推即可,而另一种请求方式postForObject(...)
与getForObject(...)
类似,即对响应的body内容进行反序列化后直接返回,此处不再赘述。
另外post请求还提供了一种返回URI的方法postForLocation(...)
,该方法提供了三种重载实现,其传参与上面类似,不同的是传参不需要再指定返回的body的实体类型,响应的相应资源可以从URI对象中获取。
同样地,RestTemplate 还提供了Put、Delete、Patch等常规方法,方法地命名与上述方法类似,使用方式也基本一致,此处不再赘述。
exchange
exchange(...)
不默认指定类型,使用范围更广,且可指定的参数也更多,以下对 exchange(...)
的八个重载方法进行介绍。
- exchange(String url, HttpMethod method, HttpEntity<?> requestEntity, Class
responseType, Object… uriVariables)
第一个参数指定了请求的URL;第二参数指定请求方法;第三个参数指定请求头及请求体;第三个参数指定了响应的body的反序列化类型;最后一个参数可变数组指定URL中的绑定参数的值,具体使用如下:
String url = "http://localhost/user?param1={1}";
MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
headers.put("User-Agent", Collections.singletonList("HttpClient"));
HttpEntity<User> request = new HttpEntity<>(new User(), headers);
ResponseEntity<String> responseEntity = restTemplate.exchange(url, HttpMethod.POST, request, String.class, "value1");
- exchange(String url, HttpMethod method, HttpEntity> requestEntity, Class
responseType, Map uriVariables)
前四个参数与上一方法一致,最后一个参数以map方式绑定了URL参数,使用如下:
String url = "http://localhost/user?param1={param1}";
MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
headers.put("User-Agent", Collections.singletonList("HttpClient"));
HttpEntity<User> request = new HttpEntity<>(new User(), headers);
MultiValueMap<String, String> urlParams = new LinkedMultiValueMap<>();
urlParams.put("param1", Collections.singletonList("value1"));
ResponseEntity<String> responseEntity = restTemplate.exchange(url, HttpMethod.POST, request, String.class, urlParams);
- exchange(URI url, HttpMethod method, HttpEntity<?> requestEntity, Class
responseType)
该方法以URI形式指定了请求的地址及URL上的参数,具体如下:
String url = "http://localhost/user";
MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
headers.put("User-Agent", Collections.singletonList("HttpClient"));
HttpEntity<User> request = new HttpEntity<>(new User(), headers);
URI requestUri = UriComponentsBuilder.fromHttpUrl(url).queryParam("param1", "value1").build(true).toUri();
ResponseEntity<String> responseEntity = restTemplate.exchange(requestUri, HttpMethod.POST, request, String.class);
- exchange(URI url, HttpMethod method, HttpEntity<?> requestEntity, ParameterizedTypeReference
responseType)
该方法用于响应body反序列化涉及到泛型,第三个参数用于指定反序列化类型,具体使用如下:
ResponseEntity<List<String>> responseEntity = restTemplate.exchange(uri, HttpMethod.POST, request, new ParameterizedTypeReference<List<String>>() {
});
-
exchange(exchange(String url, HttpMethod method, HttpEntity<?> requestEntity, ParameterizedTypeReference
responseType, Object… uriVariables)):同样地用于指定响应body内容反序列化类型为泛型类型,适用范围更广 -
exchange(String url, HttpMethod method, HttpEntity> requestEntity, ParameterizedTypeReference
responseType, Map uriVariables):同样地用于指定响应body内容反序列化类型为泛型类型,适用范围更广 -
exchange(RequestEntity<?> requestEntity, Class
responseType):第一个参数为请求实体,包含了uri、请求头、请求方法等信息,具体使用如下:
URI requestUri = UriComponentsBuilder.fromHttpUrl(url).queryParam("param1", "value1").build(true).toUri();
RequestEntity<User> requestEntity = RequestEntity.post(requestUri).accept(MediaType.APPLICATION_JSON_UTF8)
.header("User-Agent", "HttpClient").body(new User());
ResponseEntity<String> responseEntity = restTemplate.exchange(requestEntity, String.class);
- exchange(RequestEntity<?> requestEntity, ParameterizedTypeReference
responseType):同样地用于指定响应body内容反序列化类型,适用范围更广
execute
execute(...)
是 exchange(...)
和xxxForEntity
都调用的方法,相比较更为底层,可操作的空间更大,但也意味着调用起来没后两者方便,以execute(URI url, HttpMethod method, RequestCallback requestCallback, ResponseExtractorrequestCallback
用于操作请求头和请求体,在请求发出前执行;参数ResponseExtractor
用于解析HTTP响应的数据,如响应头及响应体等,而且不需要处理异常及资源的关闭。