Spring之RestTemplate使用

RestTemplate位于:
org.springframework.web.client.RestTemplate
spring-web
他是Spring web模块提供的一个发送http请求的工具。在使用了Spring的应用中,使用这个工具是非常普遍的,使用的细节和特性是需要了解的。

一、设计思想

1、RestTempldate作为暴露给用户的使用类
2、RestTemplate继承抽象类org.springframework.http.client.support.InterceptingHttpAccessor
3、InterceptingHttpAccessor继承抽象类org.springframework.http.client.support.HttpAccessor
4、org.springframework.http.client.ClientHttpRequest接口是请求执行的入口,他是发送请求数据的工作者,实现类有多种,我们可以使用Apache的HttpClient、OkHttp3、Netty4都可,但这些都需要额外导包,默认情况下Spring使用的是java.net.HttpURLConnection。ClientHttpRequest接口中就一个方法:

public interface ClientHttpRequest extends HttpRequest, HttpOutputMessage {

	ClientHttpResponse execute() throws IOException;

}

5、ClientHttpRequest的产生是通过工厂来生产的
org.springframework.http.client.ClientHttpRequestFactory定义:

@FunctionalInterface
public interface ClientHttpRequestFactory {

	ClientHttpRequest createRequest(URI uri, HttpMethod httpMethod) throws IOException;

}

6、RestTemplate默认使用org.springframework.http.client.SimpleClientHttpRequestFactory作为生产ClientHttpRequest的工厂,它使用的java.net.HttpURLConnection来进行连接和发送数据。

二、使用经验

1、JDK <1.8 doesn't support getOutputStream with HTTP DELETE,也就是说如果JDK的版本低于1.8的话,那么Delete请求是不支持body体的。
2、对于默认HttpURLConnection有几个特点要注意:
a、HttpURLConnection对象不能直接构造,需要通过URL类中的openConnection()方法来获得
b、HttpURLConnection的connect()函数,实际上只是建立了一个与服务器的TCP连接,并没有实际发送HTTP请求。HTTP请求实际上直到我们获取服务器响应数据(如调用getInputStream()、getResponseCode()等方法)时才正式发送出去,所以配置信息都需要在connect()方法执行之前完成
c、HttpURLConnection是基于HTTP协议的,其底层通过socket通信实现。如果不设置超时(timeout),在网络异常的情况下,可能会导致程序僵死而不继续往下执行。请务必设置
d、HTTP正文的内容是通过OutputStream流写入的, 向流中写入的数据不会立即发送到网络,而是存在于内存缓冲区中,待流关闭时,根据写入的内容生成HTTP正文,调用getInputStream()方法时,返回一个输入流,用于从中读取服务器对于HTTP请求的返回信息。
e、HttpURLConnection.connect()不是必须的。当我们需要返回值时,比如我们使用HttpURLConnection.getInputStream()方法的时候它就会自动发送请求了,所以完全没有必要调用connect()方法了。
3、一般我们使用org.springframework.http.client.HttpComponentsClientHttpRequestFactory这个类来生产ClientHttpRequest,它使用的是apache的HttpClient库,功能齐全,没有古怪的使用规则。
4、在使用默认RestTemplate时,会将返回的Http状态码4系列,5系列时抛出异常,并且后续无法读取返回的body内容,最好的解决方案就是替换掉默认的SimpleClientHttpRequestFactory,使用HttpComponentsClientHttpRequestFactory:

restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory());

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Spring RestTemplateSpring框架中的一个重要组件,用于简化HTTP请求的发送。使用RestTemplate可以实现对RESTful Web服务的访问,支持GET、POST、PUT、DELETE等常见的HTTP请求方法。 下面是Spring RestTemplate的一些基本使用方法: 1. 创建RestTemplate实例: ```java RestTemplate restTemplate = new RestTemplate(); ``` 2. 发送GET请求: ```java String url = "http://example.com/users/{userId}"; ResponseEntity<User> response = restTemplate.getForEntity(url, User.class, userId); ``` 3. 发送POST请求: ```java String url = "http://example.com/users"; User user = new User(); ResponseEntity<User> response = restTemplate.postForEntity(url, user, User.class); ``` 4. 发送PUT请求: ```java String url = "http://example.com/users/{userId}"; User user = new User(); restTemplate.put(url, user, userId); ``` 5. 发送DELETE请求: ```java String url = "http://example.com/users/{userId}"; restTemplate.delete(url, userId); ``` RestTemplate还有很多其他的方法,更详细的使用方法可以参考Spring官方文档。 ### 回答2: Spring RestTemplateSpring框架提供的用于处理RESTful请求的模板类。它封装了底层的HTTP通信细节,提供了简化的API,使得开发者可以更方便地发送HTTP请求和接收响应。 在使用RestTemplate之前,我们首先需要在项目的依赖中引入Springweb模块,因为RestTemplateweb模块的一部分。 使用RestTemplate发送HTTP请求的步骤如下: 1. 创建一个RestTemplate对象。可以直接通过new关键字创建,也可以通过Spring的依赖注入方式获取。 2. 选择合适的请求方法,并设置请求的URL和请求参数。RestTemplate提供了多种请求方法,如GET、POST等。我们可以通过参数的形式传递URL,并可以使用Map或对象封装请求参数。 3. 发送请求,并接收响应。可以调用RestTemplate的exchange()方法来发送请求,并通过ResponseEntity来接收响应。exchange方法可以指定请求方法、URL、请求体、请求头等信息,并可以通过参数化类型来指定响应的类型。 4. 解析响应。根据实际需要,我们可以使用ResponseEntity的getBody()方法获取响应的主体内容,并进行进一步的解析。 需要注意的是,使用RestTemplate发送请求时,我们可以自己编写请求头、请求体等信息,也可以通过使用RestTemplate提供的辅助方法来简化请求的构建。此外,RestTemplate还提供了异常处理和重试机制,可以更好地处理异常情况。 总的来说,Spring RestTemplate提供了简洁易用的API,帮助我们快速发送HTTP请求和处理响应,节省了开发时间和精力。它是Spring框架中非常重要的一部分,值得开发者深入学习和掌握。 ### 回答3: Spring RestTemplateSpring框架中的一个HTTP访问客户端工具,它可以方便地进行HTTP请求的发送和响应的处理。 在使用RestTemplate之前,首先需要引入相关的依赖。在Maven项目中,可以通过在pom.xml文件中添加以下依赖来使用RestTemplate: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> ``` 引入依赖后,可以通过如下方式创建一个RestTemplate对象: ``` RestTemplate restTemplate = new RestTemplate(); ``` 之后就可以使用RestTemplate对象来发送HTTP请求了。RestTemplate提供了多种发送请求的方法,例如getForObject()、postForObject()等。 使用getForObject()方法发送GET请求并接收响应: ``` String url = "http://api.example.com/data"; String response = restTemplate.getForObject(url, String.class); ``` 使用postForObject()方法发送POST请求并接收响应: ``` String url = "http://api.example.com/data"; String requestBody = "param1=value1&param2=value2"; String response = restTemplate.postForObject(url, requestBody, String.class); ``` RestTemplate还提供了其他一些方法,例如exchange()方法可以发送更复杂的请求,并接收带有响应头和状态码等信息的响应对象。 在使用RestTemplate发送请求时,可以通过设置请求头、请求体、URI参数等来定制请求。可以通过如下方式来设置请求头: ``` HttpHeaders headers = new HttpHeaders(); headers.set("Authorization", "Bearer token"); HttpEntity<String> requestEntity = new HttpEntity<>(headers); ``` 可以通过如下方式来设置请求体: ``` MultiValueMap<String, String> requestBody = new LinkedMultiValueMap<>(); requestBody.add("param1", "value1"); requestBody.add("param2", "value2"); HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(requestBody); ``` 可以通过如下方式来设置URI参数: ``` String url = "http://api.example.com/data?param1={param1}&param2={param2}"; Map<String, String> uriVariables = new HashMap<>(); uriVariables.put("param1", "value1"); uriVariables.put("param2", "value2"); String response = restTemplate.getForObject(url, String.class, uriVariables); ``` 总结来说,Spring RestTemplate是一个用于发送和处理HTTP请求的方便工具,通过引入相关依赖并创建RestTemplate对象,可以使用它发送不同类型的HTTP请求,并对响应进行处理。通过设置请求头、请求体、URI参数等,可以对请求进行定制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值