掌握Spring 中的 RestTemplate

添加依赖项

如果你使用Maven,需要在pom.xml文件中包含Spring Web依赖项来使用RestTemplate:

xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

如果使用的是Gradle,在build.gradle文件中添加以下依赖项:

arduino 复制代码
implementation 'org.springframework.boot:spring-boot-starter-web'

创建RestTemplate Bean

在Spring配置类中定义一个RestTemplate bean,以便在需要的地方注入它:

java 复制代码
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class AppConfig {

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

使用RestTemplate进行HTTP请求

GET请求

要执行GET请求,可以使用getForObjectgetForEntity方法。

java 复制代码
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

@Service
public class RestTemplateService {

    @Autowired
    private RestTemplate restTemplate;

    public String getPost(int id) {
        String url = "https://jsonplaceholder.typicode.com/posts/" + id;
        return restTemplate.getForObject(url, String.class);
    }
}

POST请求

对于POST请求,可以使用postForObjectpostForEntity方法。

java 复制代码
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import java.util.HashMap;
import java.util.Map;

@Service
public class RestTemplateService {

    @Autowired
    private RestTemplate restTemplate;

    public String createPost() {
        String url = "https://jsonplaceholder.typicode.com/posts";
        Map<String, String> request = new HashMap<>();
        request.put("title", "foo");
        request.put("body", "bar");
        request.put("userId", "1");
        return restTemplate.postForObject(url, request, String.class);
    }
}

PUT请求

要更新资源,可以使用put方法:

java 复制代码
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import java.util.HashMap;
import java.util.Map;

@Service
public class RestTemplateService {

    @Autowired
    private RestTemplate restTemplate;

    public void updatePost(int id) {
        String url = "https://jsonplaceholder.typicode.com/posts/" + id;
        Map<String, String> request = new HashMap<>();
        request.put("title", "updated title");
        request.put("body", "updated body");
        restTemplate.put(url, request);
    }
}

DELETE请求

要删除资源,使用delete方法:

java 复制代码
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

@Service
public class RestTemplateService {

    @Autowired
    private RestTemplate restTemplate;

    public void deletePost(int id) {
        String url = "https://jsonplaceholder.typicode.com/posts/" + id;
        restTemplate.delete(url);
    }
}

处理响应

RestTemplate提供了几种处理响应的方法。最简单的是getForObject,它直接返回响应体。或者,getForEntity返回一个ResponseEntity,其中包含更多详细信息,如响应头和状态码。

java 复制代码
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

@Service
public class RestTemplateService {

    @Autowired
    private RestTemplate restTemplate;

    public ResponseEntity<String> getPostEntity(int id) {
        String url = "https://jsonplaceholder.typicode.com/posts/" + id;
        return restTemplate.getForEntity(url, String.class);
    }
}

自定义RestTemplate

超时配置

可以为RestTemplate使用的底层HTTP客户端配置超时:

java 复制代码
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;

@Configuration
public class AppConfig {

    @Bean
    public RestTemplate restTemplate() {
        HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
        factory.setReadTimeout(5000);
        factory.setConnectTimeout(5000);
        return new RestTemplate(factory);
    }
}

拦截器

可以添加拦截器来操作请求和响应:

java 复制代码
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.web.client.RestTemplate;
import java.io.IOException;
import java.util.Collections;

@Configuration
public class AppConfig {

    @Bean
    public RestTemplate restTemplate() {
        RestTemplate restTemplate = new RestTemplate();
        restTemplate.setInterceptors(Collections.singletonList(new CustomClientHttpRequestInterceptor()));
        return restTemplate;
    }
}

class CustomClientHttpRequestInterceptor implements ClientHttpRequestInterceptor {

    @Override
    public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
        // 在此处修改请求
        ClientHttpResponse response = execution.execute(request, body);
        // 在此处修改响应
        return response;
    }
}

注意事项

  • 阻塞特性:RestTemplate是同步的,会阻塞执行线程,直到请求完成。对于高吞吐量或对延迟敏感的应用程序,这可能是一个缺点。

  • 弃用:随着WebClient的引入,RestTemplate不再是新开发的首选。Spring团队建议在非阻塞和响应式应用程序中使用WebClient。

  • 缺乏高级功能:RestTemplate缺乏WebClient提供的一些高级功能和灵活性,例如更好的非阻塞I/O处理和响应式流处理。

结论

RestTemplate是在Spring应用程序中与RESTful Web服务交互的强大且易于使用的工具。其简单的API允许快速集成和处理HTTP请求和响应。

相关推荐
刘龙超9 分钟前
如何应对 Android 面试官 -> 电量如何优化?
android·java
向哆哆15 分钟前
Java 企业级应用:SOA 与微服务的对比与选择
java·开发语言·微服务
登登登__19 分钟前
MongoDB
java
JZC_xiaozhong28 分钟前
制造企业如何通过实现数据统一?
大数据·spring boot·后端·制造·mdm·主数据管理·数据集成与应用集成
ππ记录44 分钟前
java面试题带答案2025最新整理
java·开发语言
PHASELESS4111 小时前
Java栈与队列深度解析:结构、实现与应用指南
java·开发语言·算法
uhakadotcom1 小时前
Python中orjson、json、json5三大JSON库简单对比与实用教程
后端·面试·github
Huazie1 小时前
flea-cache使用之Redis哨兵模式接入
java·redis·开源
啊阿狸不会拉杆1 小时前
数据结构-限定性线性表 - 栈与队列
java·c语言·数据结构·c++·python·算法
南雨北斗2 小时前
Docker部署的优缺点
后端