(一)项目参加


参考SpringBoot项目的RestTemplateDemo

案例:ZJJ_SpringBoot_2020/02/09_14:09:27_147dp


经常需要发送一个GET/POST请求到其他系统(REST API),通过JDK自带的HttpURLConnection、Apache HttpClient、Netty 4、OkHTTP 2/3都可以实现。

Spring的RestTemplate封装了这些库的实现,使用起来更简洁。

RestTemplate包含以下几个部分:
HttpMessageConverter 对象转换器
ClientHttpRequestFactory 默认是JDK的HttpURLConnection
ResponseErrorHandler 异常处理
ClientHttpRequestInterceptor 请求拦截器

RestTemplate[笔记] - 图1


RestTemplate定义了36个与REST资源交互的方法,其中的大多数都对应于HTTP的方法。
其实,这里面只有11个独立的方法,其中有十个有三种重载形式,而第十一个则重载了六次,这样一共形成了36个方法。

delete() 在特定的URL上对资源执行HTTP DELETE操作

exchange()
在URL上执行特定的HTTP方法,返回包含对象的ResponseEntity,这个对象是从响应体中
映射得到的

execute() 在URL上执行特定的HTTP方法,返回一个从响应体映射得到的对象

getForEntity() 发送一个HTTP GET请求,返回的ResponseEntity包含了响应体所映射成的对象

getForObject() 发送一个HTTP GET请求,返回的请求体将映射为一个对象

postForEntity()
POST 数据到一个URL,返回包含一个对象的ResponseEntity,这个对象是从响应体中映射得
到的

postForObject() POST 数据到一个URL,返回根据响应体匹配形成的对象

headForHeaders() 发送HTTP HEAD请求,返回包含特定资源URL的HTTP头

optionsForAllow() 发送HTTP OPTIONS请求,返回对特定URL的Allow头信息

postForLocation() POST 数据到一个URL,返回新创建资源的URL

put() PUT 资源到特定的URL

实际上,由于Post 操作的非幂等性,它几乎可以代替其他的CRUD操作.





(二)设置HTTP Header信息

Java代码 RestTemplate[笔记] - 图2)
1. // 1-Content-Type
2. RequestEntity requestEntity = RequestEntity
3. .post(new URI(uri))
4. .contentType(MediaType.APPLICATION_JSON)
5. .body(user);
6.
7. // 2-Accept
8. RequestEntity requestEntity = RequestEntity
9. .post(new URI(uri))
10. .accept(MediaType.APPLICATION_JSON)
11. .body(user);
12.
13. // 3-Other
14. RequestEntity requestEntity = RequestEntity
15. .post(new URI(uri))
16. .header(“Authorization”, “Basic “ + base64Credentials)
17. .body(user);

(三)异常处理捕获HttpServerErrorException


Java代码 RestTemplate[笔记] - 图3)
1. int retryCount = 0;
2. while (true) {
3. try {
4. responseEntity = restTemplate.exchange(requestEntity, String.class);
5. break;
6. } catch (HttpServerErrorException e) {
7. if (retryCount == 3) {
8. throw e;
9. }
10. retryCount++;
11. }
12. }

(四)自定义异常处理


参考:
https://www.cnblogs.com/liuxm2017/articles/9958392.html


(五)设置超时时间



Java代码 RestTemplate[笔记] - 图4)
1. @Configuration
2. public class RestClientConfig {
3.
4. @Bean
5. public RestTemplate restTemplate() {
6. return new RestTemplate(clientHttpRequestFactory());
7. }
8.
9. private ClientHttpRequestFactory clientHttpRequestFactory() {
10. HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
11. factory.setReadTimeout(2000);
12. factory.setConnectTimeout(2000);
13. return factory;
14. }
15. }

(六)设置连接池


Java代码 RestTemplate[笔记] - 图5)
1. @Configuration
2. public class RestClientConfig {
3.
4. @Bean
5. public ClientHttpRequestFactory httpRequestFactory() {
6. return new HttpComponentsClientHttpRequestFactory(httpClient());
7. }
8.
9. @Bean
10. public RestTemplate restTemplate() {
11. return new RestTemplate(httpRequestFactory());
12. }
13.
14. @Bean
15. public HttpClient httpClient() {
16. Registry registry = RegistryBuilder. create()
17. .register(“http”, PlainConnectionSocketFactory.getSocketFactory())
18. .register(“https”, SSLConnectionSocketFactory.getSocketFactory())
19. .build();
20. PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry);
21. connectionManager.setMaxTotal(5);
22. connectionManager.setDefaultMaxPerRoute(5);
23.
24. RequestConfig requestConfig = RequestConfig.custom()
25. .setSocketTimeout(8000)
26. .setConnectTimeout(8000)
27. .setConnectionRequestTimeout(8000)
28. .build();
29.
30. return HttpClientBuilder.create()
31. .setDefaultRequestConfig(requestConfig)
32. .setConnectionManager(connectionManager)
33. .build();
34. }
35.
36. }

(七)发送文件

Java代码 RestTemplate[笔记] - 图6)
1. MultiValueMap multiPartBody = new LinkedMultiValueMap<>();
2. multiPartBody.add(“file”, new ClassPathResource(“/tmp/user.txt”));
3. RequestEntity> requestEntity = RequestEntity
4. .post(uri)
5. .contentType(MediaType.MULTIPART_FORM_DATA)
6. .body(multiPartBody);

(八)下载文件

Java代码 RestTemplate[笔记] - 图7)
1. // 小文件
2. RequestEntity requestEntity = RequestEntity.get(uri).build();
3. ResponseEntity<byte[]> responseEntity = restTemplate.exchange(requestEntity, byte[].class);
4. byte[] downloadContent = responseEntity.getBody();
5.
6. // 大文件
7. ResponseExtractor> responseExtractor = new ResponseExtractor>() {
8. @Override
9. public ResponseEntity extractData(ClientHttpResponse response) throws IOException {
10. File rcvFile = File.createTempFile(“rcvFile”, “zip”);
11. FileCopyUtils.copy(response.getBody(), new FileOutputStream(rcvFile));
12. return ResponseEntity.status(response.getStatusCode()).headers(response.getHeaders()).body(rcvFile);
13. }
14. };
15. File getFile = this.restTemplate.execute(targetUri, HttpMethod.GET, null, responseExtractor);


(九)Spring Boot的RestTemplateBuilder
全局设置

Java代码 RestTemplate[笔记] - 图8)
1. @Component
2. public class CustomRestTemplateCustomizer implements RestTemplateCustomizer {
3. @Override
4. public void customize(RestTemplate restTemplate) {
5. new RestTemplateBuilder()
6. .detectRequestFactory(false)
7. .basicAuthorization(“username”, “password”)
8. .uriTemplateHandler(new OkHttp3ClientHttpRequestFactory())
9. .errorHandler(new CustomResponseErrorHandler())
10. .configure(restTemplate);
11. }
12. }

单独设置
Java代码 RestTemplate[笔记] - 图9)
1. @Service
2. public class MyRestClientService {
3.
4. private RestTemplate restTemplate;
5.
6. public MyRestClientService(RestTemplateBuilder restTemplateBuilder) {
7. this.restTemplate = restTemplateBuilder
8. .basicAuthorization(“username”, “password”)
9. .setConnectTimeout(3000)
10. .setReadTimeout(5000)
11. .rootUri(“http://api.example.com/“)
12. .errorHandler(new CustomResponseErrorHandler())
13. .additionalMessageConverters(new CustomHttpMessageConverter())
14. .uriTemplateHandler(new OkHttp3ClientHttpRequestFactory())
15. .build();
16. }
17.
18. public String site() {
19. return this.restTemplate.getForObject(“http://rensanning.iteye.com/“, String.class);
20. }
21.
22. }

(十)Java RestTemplate post请求传递参数遇到的坑


https://www.yuque.com/docs/share/6b00a86c-816e-4a26-86b1-b8161e86ccc8?#

(十一)put和delete请求无返回值问题解决


https://www.yuque.com/docs/share/6b00a86c-816e-4a26-86b1-b8161e86ccc8?#

 RestTemplate参考




先放着,等以后需要了再深度去研究.
参考:
https://www.yuque.com/docs/share/6f0c2174-e9f1-49af-844f-01087373c3c9?#


 exchange

(一)exchange发送post请求


参考:
https://juejin.im/post/5cda4984f265da03bb6fd50b?utm_source=gold_browser_extension

 execute

execute()方法是以上所有方法的底层调用