REST访问(RestTemplate)
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)相关推荐
- JAVA架构知识总结
JAVA 通讯 通讯协议 HTTP IO 计算机网络面试题 设计模式 七大设计原则 设计模式 JAVA基础加强 基础 多线程 登录 数据库 Spring spring boot 和Spring区别 s ...
- B站 全套java面试(200道)问题MD(题目+答案)
Java面向对象有哪些特征,如何应用 面向对象编程是利用类和对象编程的一种思想.万物可归类,类是对于世界事物的高度抽象 ,不同的事物之间有不同的关系 ,一个类自身与外界的封装关系,一个父类和子类的 ...
- Eureka restTemplate访问超时
错误代码 I/O error on GET request for "http://sushibase/v1/Publich/authorize": Connection time ...
- spring resttemplate 中文参数_SpringBoot使用RestTemplate访问第三方接口
养成习惯,先赞后看!!! 前言 相信大家都知道如何在自己的项目里面调用自己的接口,只需要调用自己项目里面接口特定的URL地址就行了,但是如果是调用其他项目的接口呢,这时候如果是直接调用的话,很明显我们 ...
- 【Spring学习】RestTemplate访问Rest服务总结
RestTemplate是Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率.调用RestTemplate的 ...
- java rest httpclient_Httpclient与RestTemplate的比较(比httpClient更优雅的Restful URL访问)...
一.HttpClient (一)HttpClient 客户端 1.HttpClient 是 apache 的开源,需要引入两个包:httpclient-4.2.4.jar 和 httpcore-4.2 ...
- java restful中文乱码_使用RestTemplate访问RESTful服务乱码处理
在接口服务开发中,我们经常用到Spring模板类RestTemplate访问restful服务.但RestTemplate处理中文乱码问题比较麻烦.以我们项目Spring版本4.1.3.RELEASE ...
- Spring Boot RestTemplate 忽略证书访问https
在Spring Boot中,RestTemplate 一般使用 @Autowired 注解自动装配, 类似: @Autowiredprivate RestTemplate restTemplate; ...
- Spring RestTemplate 访问https站点
RestTemplate 是Spring对HttpClient的封装, API的调用和结果的解析更简单了.举例来说,访问一个站点并获取结果的代码只需要两行代码就可以了,类似: String url = ...
最新文章
- OpenCV对图像进行尺寸变换
- ADO.Net练习1
- boost::gil::channel_view用法的测试程序
- Cheat_Sheet ---Keras、Matlab、Matplotlib、Numpy、Pandas、Scikit-Learn、SciPy
- Objective-C征途:Hello Objective-C
- 数据库oracle 别名不能更新,数据库oracle改成mysql后Hibernate不能使用别名问题
- 面试官爱问的10大经典排序算法,20+张图来搞定
- mysql foxpro_|DBSync for FoxPro and MySQL(数据库同步工具)下载v4.7.1免费版 - 欧普软件下载...
- w3c离线手册2019
- python 复制word内容_Python读取word文本操作详解
- VirtualLab基础实验教程-7.偏振(2)
- G1D17-研究方向rce45-49不快乐就去敲敲代码
- Buxwiz注册详解
- 攻防世界misc高手进阶区刷题记录
- pymysql——Python连接SQL
- 私有云linux虚拟机扩容内存,搭建nextcloud私有云存储网盘的教程详解
- ping 命令打印日志
- hdoj4857逃生
- 美通社持续加强亚太地区新闻发布网络
- BPEL 及其发展历程
热门文章
- OriginPro 2021安装教程(手把手式安装)
- 北斗导航 | 学习PPP和PPP-RTK
- 什么是“小小输入法”软件? 用其进行郑码输入练习
- mysql提供的六种约束_SQL的六种约束
- 怎么给linux分区,如何合理地给你的Linux分区
- linux 32bit swt,无法在Windows 32位上加载SWT库
- c语言运算优先级记忆方法
- IJCAI 2021 ICAPS 2021自动强化学习挑战赛正式开赛
- 第四届工业大数据创新竞赛-Top1方案
- C指针原理(31)-Ncurses-文本终端的图形