有了RestTemplate你还在手撕写HttpClient?

Posted Javachichi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有了RestTemplate你还在手撕写HttpClient?相关的知识,希望对你有一定的参考价值。

前言

在微服务大行其道的今天,HTTP调用是程序员无法避免的常规操作。

RestTemplateSpring提供的一个,用于发起HTTP调用的客户端。相比于传统的HttpComponentsRestTemplate使用起来更简单,更方便。

发起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等知识点解析,内容丰富,图文结合!)

蚂蚁金服Java研发岗三面:MySQL+秒杀+Redis+JVM等(终获offer)
这份专题文档是免费分享的,有需要的朋友可以看向下面来获取!!

需要完整版文档的小伙伴,可以一键三连,下方获取免费领取方式!
在这里插入图片描述

以上是关于有了RestTemplate你还在手撕写HttpClient?的主要内容,如果未能解决你的问题,请参考以下文章

你还在用古老的HTML和CSS吗?还在手敲吗?那么你是时候打开新前端的大门了————Element-UI全面详解

Golang的一个简单实用的http客户端库httpc

Spring RestTemplate为何必须搭配MultiValueMap?

有了美签就想入境?你还得会平衡二叉树

yaws 因 httpc 崩溃:请求 docker 容器提供的 URL

上手体验Vue3 Vite的魅力(“快”的艺术),有了它,你还会用webpack吗?