有了RestTemplate你还在手撕写HttpClient?
Posted Javachichi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有了RestTemplate你还在手撕写HttpClient?相关的知识,希望对你有一定的参考价值。
前言
在微服务大行其道的今天,HTTP
调用是程序员无法避免的常规操作。
RestTemplate
是Spring
提供的一个,用于发起HTTP
调用的客户端。相比于传统的HttpComponents
,RestTemplate
使用起来更简单,更方便。
发起Get请求
1. 获取JSON
类型的返回
RestTemplate restTemplate = new RestTemplate();
String fooResourceUrl = "http://localhost:8080/spring-rest/foos";
ResponseEntity<String> response = restTemplate.getForEntity(fooResourceUrl + "/1", String.class);
assertThat(response.getStatusCode(), equalTo(HttpStatus.OK));
2. 获取POJO
类型的返回 我们定义一个Foo
类
public class Foo implements Serializable {
private long id;
private String name;
// standard getters and setters
}
使用RestTemplate
发起Get
请求
Foo foo = restTemplate .getForObject(fooResourceUrl + "/1", Foo.class);
assertThat(foo.getName(), notNullValue()); assertThat(foo.getId(), is(1L));
获取Header信息
HttpHeaders httpHeaders = restTemplate.headForHeaders(fooResourceUrl);
//获取ContentType
assertTrue(httpHeaders.getContentType().includes(MediaType.APPLICATION_JSON));
发起Post请求
RestTemplate restTemplate = new RestTemplate();
HttpEntity<Foo> request = new HttpEntity<>(new Foo("bar"));
Foo foo = restTemplate.postForObject(fooResourceUrl, request, Foo.class);
assertThat(foo, notNullValue());
assertThat(foo.getName(), is("bar"));
模拟Form表单提交
通过POST
方式提交表单数据,首先需要设置头部信息,将Content-Type
设置为 application/x-www-form-urlencoded
。
如果你觉得自己学习效率低,缺乏正确的指导,可以加入资源丰富,学习氛围浓厚的技术圈一起学习交流吧! [Java架构群]
群内有许多来自一线的技术大牛,也有在小厂或外包公司奋斗的码农,我们致力打造一个平等,高质量的JAVA交流圈子,不一定能短期就让每个人的技术突飞猛进,但从长远来说,眼光,格局,长远发展的方向才是最重要的。
接下来我们将表单中的数据项封装进Map
。最后将Header
和表单数据一起封装成HttpEntity
。
代码示例如下
HttpHeaders headers = new HttpHeaders();
//设置头部信息
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
//将表单信息封装进Map
MultiValueMap<String, String> map= new LinkedMultiValueMap<>();
map.add("id", "1");
//将表单数据封装进HttpEntity
HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(map, headers);
//发起POST请求
ResponseEntity<String> response = restTemplate.postForEntity( fooResourceUrl+"/form", request , String.class);
assertThat(response.getStatusCode(), is(HttpStatus.CREATED));
通过PUT方式更新资源
更新资源既可以通过PUT
方法,也可以通过exchange()
。示例如下。
Foo updatedInstance = new Foo("newName");
updatedInstance.setId(createResponse.getBody().getId());
String resourceUrl = fooResourceUrl + '/' + createResponse.getBody().getId();
HttpEntity<Foo> requestUpdate = new HttpEntity<>(updatedInstance, headers);
//通过exchange发送PUT类型请求
template.exchange(resourceUrl, HttpMethod.PUT, requestUpdate, Void.class);
//直接通过putAPI进行更新
template.put(resourceUrl,requestUpdate,Void.class);
发起DELETE请求
通过delete
删除资源。
String entityUrl = fooResourceUrl + "/" + existingResource.getId();
restTemplate.delete(entityUrl);
通过exchange()发起请求
通过exchange()
方法可以发起任意类型的HTTP
请求。代码示例如下。
RestTemplate restTemplate = new RestTemplate();
HttpEntity<Foo> request = new HttpEntity<>(new Foo("bar"));
//传递参数为HttpMethod.POST, 发起POST类型参数
ResponseEntity<Foo> response = restTemplate .exchange(fooResourceUrl, HttpMethod.POST, request, Foo.class);
assertThat(response.getStatusCode(), is(HttpStatus.CREATED));
Foo foo = response.getBody();
assertThat(foo, notNullValue());
assertThat(foo.getName(), is("bar"));
配置超时时间
可以通过ClientHttpRequestFactory
配置RestTemplate
的超时时间。代码示例如下:
RestTemplate restTemplate = new RestTemplate(getClientHttpRequestFactory());
private ClientHttpRequestFactory getClientHttpRequestFactory() {
int timeout = 5000;
HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory();
clientHttpRequestFactory.setConnectTimeout(timeout);
return clientHttpRequestFactory;
}
总结
RestTemplate
使用起来即简单又方便,RestTemplate
的设计思想和JDBCTemplate
如出一辙。相信这也是Spring
的哲学。
注意:现在
RestTemplate
已经不被官方推荐使用,官方推荐使用WebClient
。下一篇文章将会介绍WebClient
的使用。
最后
粉丝福利:以下是Java面试1—到5年以上开发必问到的面试问点,也都是一线互联网公司Java面试必备技能,下面是参照阿里年薪50W所需具备的技能图,大家可以参考下!
同时针对这12个技能,我在这整理了一份Java架构进阶面试专题PDF文档(含450题解析,包括Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并发,设计模式,MySQL等知识点解析,内容丰富,图文结合!)
这份专题文档是免费分享的,有需要的朋友可以看向下面来获取!!
需要完整版文档的小伙伴,可以一键三连,下方获取免费领取方式!
以上是关于有了RestTemplate你还在手撕写HttpClient?的主要内容,如果未能解决你的问题,请参考以下文章
你还在用古老的HTML和CSS吗?还在手敲吗?那么你是时候打开新前端的大门了————Element-UI全面详解
Spring RestTemplate为何必须搭配MultiValueMap?