https://www.cnblogs.com/softidea/p/6910198.html

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

HttpClient的使用:http://rensanning.iteye.com/blog/1550436

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

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

@Service
public class AccountService {  @Autowired  private RestTemplate restTemplate;  // ...  

}  

(1)发送GET请求(getForObject()、getForEntity()、exchange())

// 1-getForObject()
User user1 = this.restTemplate.getForObject(uri, User.class);  // 2-getForEntity()
ResponseEntity<User> responseEntity1 = this.restTemplate.getForEntity(uri, User.class);
HttpStatus statusCode = responseEntity1.getStatusCode();
HttpHeaders header = responseEntity1.getHeaders();
User user2 = responseEntity1.getBody();  // 3-exchange()
RequestEntity requestEntity = RequestEntity.get(new URI(uri)).build();
ResponseEntity<User> responseEntity2 = this.restTemplate.exchange(requestEntity, User.class);
User user3 = responseEntity2.getBody();  

(2)发送POST请求(postForObject()、postForEntity()、exchange())

// 1-postForObject()
User user1 = this.restTemplate.postForObject(uri, user, User.class);  // 2-postForEntity()
ResponseEntity<User> responseEntity1 = this.restTemplate.postForEntity(uri, user, User.class);  // 3-exchange()
RequestEntity<User> requestEntity = RequestEntity.post(new URI(uri)).body(user);
ResponseEntity<User> responseEntity2 = this.restTemplate.exchange(requestEntity, User.class);  

(3)设置HTTP Header信息

// 1-Content-Type
RequestEntity<User> requestEntity = RequestEntity  .post(new URI(uri))  .contentType(MediaType.APPLICATION_JSON)  .body(user);  // 2-Accept
RequestEntity<User> requestEntity = RequestEntity  .post(new URI(uri))  .accept(MediaType.APPLICATION_JSON)  .body(user);  // 3-Other
RequestEntity<User> requestEntity = RequestEntity  .post(new URI(uri))  .header("Authorization", "Basic " + base64Credentials)  .body(user);  

(4)异常处理

捕获HttpServerErrorException

int retryCount = 0;
while (true) {  try {  responseEntity = restTemplate.exchange(requestEntity, String.class);  break;  } catch (HttpServerErrorException e) {  if (retryCount == 3) {  throw e;  }  retryCount++;  }
}  

自定义异常处理

public class CustomErrorHandler extends DefaultResponseErrorHandler {  @Override  public void handleError(ClientHttpResponse response) throws IOException {  }  }  

@Configuration
public class RestClientConfig {  @Bean  public RestTemplate restTemplate() {  RestTemplate restTemplate = new RestTemplate();  restTemplate.setErrorHandler(new CustomErrorHandler());  return restTemplate;  }  }  

(5)设置超时时间

@Configuration
public class RestClientConfig {  @Bean  public RestTemplate restTemplate() {  return new RestTemplate(clientHttpRequestFactory());  }  private ClientHttpRequestFactory clientHttpRequestFactory() {  HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();  factory.setReadTimeout(2000);  factory.setConnectTimeout(2000);  return factory;  }
}  

(6)设置连接池

@Configuration
public class RestClientConfig {  @Bean  public ClientHttpRequestFactory httpRequestFactory() {  return new HttpComponentsClientHttpRequestFactory(httpClient());  }  @Bean  public RestTemplate restTemplate() {  return new RestTemplate(httpRequestFactory());  }  @Bean  public HttpClient httpClient() {  Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory> create()  .register("http", PlainConnectionSocketFactory.getSocketFactory())  .register("https", SSLConnectionSocketFactory.getSocketFactory())  .build();  PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry);  connectionManager.setMaxTotal(5);  connectionManager.setDefaultMaxPerRoute(5);  RequestConfig requestConfig = RequestConfig.custom()  .setSocketTimeout(8000)  .setConnectTimeout(8000)  .setConnectionRequestTimeout(8000)  .build();  return HttpClientBuilder.create()  .setDefaultRequestConfig(requestConfig)  .setConnectionManager(connectionManager)  .build();  }  }  

(7)发送文件

MultiValueMap<String, Object> multiPartBody = new LinkedMultiValueMap<>();
multiPartBody.add("file", new ClassPathResource("/tmp/user.txt"));
RequestEntity<MultiValueMap<String, Object>> requestEntity = RequestEntity  .post(uri)  .contentType(MediaType.MULTIPART_FORM_DATA)  .body(multiPartBody);  

(8)下载文件

// 小文件
RequestEntity requestEntity = RequestEntity.get(uri).build();
ResponseEntity<byte[]> responseEntity = restTemplate.exchange(requestEntity, byte[].class);
byte[] downloadContent = responseEntity.getBody();  // 大文件
ResponseExtractor<ResponseEntity<File>> responseExtractor = new ResponseExtractor<ResponseEntity<File>>() {  @Override  public ResponseEntity<File> extractData(ClientHttpResponse response) throws IOException {  File rcvFile = File.createTempFile("rcvFile", "zip");  FileCopyUtils.copy(response.getBody(), new FileOutputStream(rcvFile));  return ResponseEntity.status(response.getStatusCode()).headers(response.getHeaders()).body(rcvFile);  }
};
File getFile = this.restTemplate.execute(targetUri, HttpMethod.GET, null, responseExtractor);  

(9)Spring Boot的RestTemplateBuilder

全局设置

@Component
public class CustomRestTemplateCustomizer implements RestTemplateCustomizer {  @Override  public void customize(RestTemplate restTemplate) {  new RestTemplateBuilder()  .detectRequestFactory(false)  .basicAuthorization("username", "password")  .uriTemplateHandler(new OkHttp3ClientHttpRequestFactory())  .errorHandler(new CustomResponseErrorHandler())  .configure(restTemplate);  }
}  

单独设置

@Service
public class MyRestClientService {  private RestTemplate restTemplate;  public MyRestClientService(RestTemplateBuilder restTemplateBuilder) {  this.restTemplate = restTemplateBuilder  .basicAuthorization("username", "password")  .setConnectTimeout(3000)  .setReadTimeout(5000)  .rootUri("http://api.example.com/")  .errorHandler(new CustomResponseErrorHandler())  .additionalMessageConverters(new CustomHttpMessageConverter())  .uriTemplateHandler(new OkHttp3ClientHttpRequestFactory())  .build();  }  public String site() {  return this.restTemplate.getForObject("http://rensanning.iteye.com/", String.class);  }  }  

http://rensanning.iteye.com/blog/2362105

转载于:https://www.cnblogs.com/softidea/p/9438783.html

REST访问(RestTemplate)相关推荐

  1. JAVA架构知识总结

    JAVA 通讯 通讯协议 HTTP IO 计算机网络面试题 设计模式 七大设计原则 设计模式 JAVA基础加强 基础 多线程 登录 数据库 Spring spring boot 和Spring区别 s ...

  2. B站 全套java面试(200道)问题MD(题目+答案)

    Java面向对象有哪些特征,如何应用 ​ 面向对象编程是利用类和对象编程的一种思想.万物可归类,类是对于世界事物的高度抽象 ,不同的事物之间有不同的关系 ,一个类自身与外界的封装关系,一个父类和子类的 ...

  3. Eureka restTemplate访问超时

    错误代码 I/O error on GET request for "http://sushibase/v1/Publich/authorize": Connection time ...

  4. spring resttemplate 中文参数_SpringBoot使用RestTemplate访问第三方接口

    养成习惯,先赞后看!!! 前言 相信大家都知道如何在自己的项目里面调用自己的接口,只需要调用自己项目里面接口特定的URL地址就行了,但是如果是调用其他项目的接口呢,这时候如果是直接调用的话,很明显我们 ...

  5. 【Spring学习】RestTemplate访问Rest服务总结

    RestTemplate是Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率.调用RestTemplate的 ...

  6. java rest httpclient_Httpclient与RestTemplate的比较(比httpClient更优雅的Restful URL访问)...

    一.HttpClient (一)HttpClient 客户端 1.HttpClient 是 apache 的开源,需要引入两个包:httpclient-4.2.4.jar 和 httpcore-4.2 ...

  7. java restful中文乱码_使用RestTemplate访问RESTful服务乱码处理

    在接口服务开发中,我们经常用到Spring模板类RestTemplate访问restful服务.但RestTemplate处理中文乱码问题比较麻烦.以我们项目Spring版本4.1.3.RELEASE ...

  8. Spring Boot RestTemplate 忽略证书访问https

    在Spring Boot中,RestTemplate 一般使用 @Autowired 注解自动装配, 类似: @Autowiredprivate RestTemplate restTemplate; ...

  9. Spring RestTemplate 访问https站点

    RestTemplate 是Spring对HttpClient的封装, API的调用和结果的解析更简单了.举例来说,访问一个站点并获取结果的代码只需要两行代码就可以了,类似: String url = ...

最新文章

  1. OpenCV对图像进行尺寸变换
  2. ADO.Net练习1
  3. boost::gil::channel_view用法的测试程序
  4. Cheat_Sheet ---Keras、Matlab、Matplotlib、Numpy、Pandas、Scikit-Learn、SciPy
  5. Objective-C征途:Hello Objective-C
  6. 数据库oracle 别名不能更新,数据库oracle改成mysql后Hibernate不能使用别名问题
  7. 面试官爱问的10大经典排序算法,20+张图来搞定
  8. mysql foxpro_|DBSync for FoxPro and MySQL(数据库同步工具)下载v4.7.1免费版 - 欧普软件下载...
  9. w3c离线手册2019
  10. python 复制word内容_Python读取word文本操作详解
  11. VirtualLab基础实验教程-7.偏振(2)
  12. G1D17-研究方向rce45-49不快乐就去敲敲代码
  13. Buxwiz注册详解
  14. 攻防世界misc高手进阶区刷题记录
  15. pymysql——Python连接SQL
  16. 私有云linux虚拟机扩容内存,搭建nextcloud私有云存储网盘的教程详解
  17. ping 命令打印日志
  18. hdoj4857逃生
  19. 美通社持续加强亚太地区新闻发布网络
  20. BPEL 及其发展历程

热门文章

  1. OriginPro 2021安装教程(手把手式安装)
  2. 北斗导航 | 学习PPP和PPP-RTK
  3. 什么是“小小输入法”软件? 用其进行郑码输入练习
  4. mysql提供的六种约束_SQL的六种约束
  5. 怎么给linux分区,如何合理地给你的Linux分区
  6. linux 32bit swt,无法在Windows 32位上加载SWT库
  7. c语言运算优先级记忆方法
  8. IJCAI 2021 ICAPS 2021自动强化学习挑战赛正式开赛
  9. 第四届工业大数据创新竞赛-Top1方案
  10. C指针原理(31)-Ncurses-文本终端的图形