Springboot 开发之 RestTemplate 简介

一、什么是RestTemplate

RestTemplate 是Spring框架提供的一个用于应用中调用REST服务的类。它简化了与HTTP服务的通信,统一了RESTFul的标准,并封装了HTTP连接,我们只需要传入URL及其返回值类型即可。RestTemplate的设计原则与许多其他Spring的模板类(如JdbcTemplate)相同,为执行复杂任务提供了一种具有默认行为的简化方法。

二、RestTemplate 的常用方法

RestTemplate提供了多种方法来进行HTTP请求,主要方法包括:

1. GET请求:

  • getForObject(String url, Class responseType, Object… uriVariables): 直接返回响应体中的数据。
  • getForEntity(String url, Class responseType, Object… uriVariables): 返回一个ResponseEntity对象,其中包含了响应的详细信息,如状态码、响应头等。

2. POST请求:

  • postForObject(String url, Object request, Class responseType): 发送POST请求,并返回响应体中的数据。
  • postForEntity(String url, Object request, Class responseType): 发送POST请求,并返回一个ResponseEntity对象。

3. PUT请求:

  • put(String url, Object request): 发送PUT请求。
  • putForObject(String url, Object request, Class responseType): 发送PUT请求,并返回响应体中的数据。

4. DELETE请求:

  • delete(String url): 发送DELETE请求。
    其他方法:
  • exchange(RequestEntity<?> request, Class responseType): 这是一个通用的方法,可以根据RequestEntity对象发送请求,并返回ResponseEntity对象。
    在这里插入图片描述

三、RestTemplate基本使用

1. pom 文件依赖

Spring Boot的 web starter 已经内置了RestTemplate的Bean,我们主需要将它引入到我们的Spring Context中,再进行下简单的配置就可以直接使用了。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.76</version>
</dependency>

2. 配置 RestTemplate

(1)默认配置:

RestTemplate默认使用 SimpleClientHttpRequestFactory,内部调用JDK的HttpURLConnection进行HTTP请求,默认的超时时间为-1(即无限期等待)。

@Configuration  
public class RestClientConfig {  
  
    @Bean  
    public RestTemplate restTemplate(RestTemplateBuilder builder) {  
        return builder.build();  
    }  
  
    // 或者自定义请求工厂  
    @Bean  
    public RestTemplate restTemplate() {  
        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();  
        factory.setReadTimeout(5000); // 设置读取超时时间  
        factory.setConnectTimeout(5000); // 设置连接超时时间  
        return new RestTemplate(factory);  
    }  
}

(2)自定义配置:

可以通过设置ClientHttpRequestFactory来自定义RestTemplate的配置,如使用HttpComponentsClientHttpRequestFactory(基于Apache HttpClient)或OkHttp3ClientHttpRequestFactory(基于OkHttp)等。
可以配置连接池、超时时间、请求和响应的编解码等。

@Configuration
public class RestTemplateConfig {
   @Bean 
    public HttpClientConnectionManager poolingHttpClientConnectionManager() {
        PoolingHttpClientConnectionManager poolingHttpClientConnectionManager = new PoolingHttpClientConnectionManager();
        // 设置最大连接数
        poolingHttpClientConnectionManager.setMaxTotal(500);
        // 设置每个路由的最大连接数
        poolingHttpClientConnectionManager.setDefaultMaxPerRoute(100);
        return poolingHttpClientConnectionManager;
    }

    @Bean
    public HttpClient httpClient(HttpClientConnectionManager poolingHttpClientConnectionManager) {
        HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
        // 设置 HttpClient 的连接管理器
        httpClientBuilder.setConnectionManager(poolingHttpClientConnectionManager);
        return httpClientBuilder.build();
    }

    @Bean
    public ClientHttpRequestFactory clientHttpRequestFactory(HttpClient httpClient) {
        HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory();
        // 设置 HttpClient
        clientHttpRequestFactory.setHttpClient(httpClient);
        // 设置连接超时时间(毫秒)
        clientHttpRequestFactory.setConnectTimeout(5 * 1000);
        // 设置读取超时时间(毫秒)
        clientHttpRequestFactory.setReadTimeout(10 * 1000);
        // 设置从连接池获取连接的超时时间(毫秒)
        clientHttpRequestFactory.setConnectionRequestTimeout(10 * 1000);
        return clientHttpRequestFactory;
    }

    @Bean
    public RestTemplate restTemplate(ClientHttpRequestFactory clientHttpRequestFactory) {
        RestTemplate restTemplate = new RestTemplate();
        // 设置请求工厂
        restTemplate.setRequestFactory(clientHttpRequestFactory);
        return restTemplate;
    }

}

四、服务端代码实战

1. 服务端接口类

@RestController
public class RestControllerDemo {

	/**
     * 普通Get
     *
     * @param name
     * @return
     */
    @GetMapping("/get")
    private String getMethod(@RequestParam("name") String name) {
        System.out.println("getMethod : name=" + name);
        return name;
    }

    /**
     * Restful Get
     *
     * @param name
     * @return
     */
    @GetMapping("/getName/{name}")
    private String getRestName(@PathVariable("name") String name) {
        System.out.println("getRestName : name=" + name);
        return name;
    }

    /**
     * post
     *
     * @param name
     * @return
     */
    @PostMapping("/post")
    private String postMethod(@RequestParam("name") String name) {
        System.out.println("postMethod : name=" + name);
        return name;
    }

    /**
     * post json
     *
     * @param stu
     * @return
     */
    @PostMapping("/postBody")
    public String postBodyMethod(@RequestBody String stu) {
        Student student = JSONObject.parseObject(stu, Student.class);
        System.out.println("postBodyMethod : student=" + student);
        return student.toString();
    }
}

2. 测试类

@SpringBootTest
class DemoApplicationTests {
	// 引入 restTemplate
    @Resource
    private RestTemplate restTemplate;

    @Test
    void getTest() {
        String str = restTemplate.getForObject("http://localhost:8888/get?name=zs", String.class);
        System.out.println(str);
    }

    @Test
    void getRestTest() {
        String name = "ls";
        String str = restTemplate.getForObject("http://localhost:8888/getName/" + name, String.class);
        System.out.println(str);
    }

    @Test
    void postTest() {
        LinkedMultiValueMap<String, String> map = new LinkedMultiValueMap<>();
        map.set("name", "zs");
        String str = restTemplate.postForObject("http://localhost:8888/post", map, String.class);
        System.out.println(str);
    }

    @Test
    void postBodyTest() {
        HttpHeaders headers = new HttpHeaders();
        MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
        headers.setContentType(type);
        headers.add("Accept", MediaType.APPLICATION_JSON.toString());
        HashMap<String, Object> map = new HashMap<>();
        map.put("name", "zs");
        map.put("age", 23);
        String stu = JSON.toJSONString(map);
        HttpEntity<String> formEntity = new HttpEntity<String>(stu, headers);
        String str = restTemplate.postForObject("http://localhost:8888/postBody", formEntity, String.class);
        System.out.println(str);
    }

}

3. exchange 使用示例

通过 HttpHeaders 和 UriComponentsBuilder 可以方便地添加自定义请求头和构建带参数的 URL。

UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url)  
    .queryParam("param1", "value1")  
    .queryParam("param2", "value2");  
  
String finalUrl = builder.toUriString();  
HttpHeaders headers = new HttpHeaders();  
headers.add("Custom-Header", "HeaderValue");  
HttpEntity<String> request = new HttpEntity<>(null, headers);  
  
ResponseEntity<String> response = restTemplate.exchange(  
    finalUrl,  
    HttpMethod.GET,  
    request,  
    String.class  
);
  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spring Boot 提供了 RestTemplate 类来方便地发送 HTTP 请求并处理响应。通过 RestTemplate,我们可以很容易地使用 HTTP 协议来访问 RESTful Web 服务,而无需手动解析 HTTP 请求和响应。 要使用 RestTemplate,我们需要在 Spring Boot 应用程序中添加它的依赖项,可以通过 Maven 或 Gradle 进行添加。一旦添加了依赖项,我们就可以通过使用 RestTemplateBuilder 创建一个 RestTemplate 实例。 在使用 RestTemplate 发送 HTTP 请求时,我们可以指定请求方法、请求头、请求体和 URL 参数等信息,并可以选择将响应映射到指定的 Java 对象上。RestTemplate 还提供了一些便捷的方法来访问 RESTful Web 服务,如 GET、POST、PUT、DELETE 等。 总的来说,Spring Boot 整合 RestTemplate 可以帮助我们更轻松地访问 RESTful Web 服务,并提供了许多便捷的方法来处理 HTTP 请求和响应。 ### 回答2: Spring Boot是一个用于快速构建基于Java的应用程序的框架。RestTemplateSpring框架中的一个用于发送HTTP请求的模板类。 通过整合RestTemplateSpring Boot应用程序中,我们可以方便地与其他RESTful服务进行通信。下面是整合RestTemplate的步骤: 1. 在Spring Boot应用程序的pom.xml文件中添加依赖: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> ``` 2. 在应用程序的配置类中创建RestTemplate的Bean: ```java @Configuration public class AppConfig { @Bean public RestTemplate restTemplate() { return new RestTemplate(); } } ``` 3. 在需要使用RestTemplate的类中注入RestTemplate的实例: ```java @RestController public class MyController { @Autowired private RestTemplate restTemplate; // 使用RestTemplate发送HTTP请求 // ... } ``` 4. 使用RestTemplate发送HTTP请求: ```java @RestController public class MyController { @Autowired private RestTemplate restTemplate; @GetMapping("/example") public String example() { String url = "https://api.example.com/data"; ResponseEntity<String> response = restTemplate.getForEntity(url, String.class); String result = response.getBody(); return result; } } ``` 在以上示例中,我们通过调用RestTemplate的getForEntity方法发送GET请求,并将响应结果转换成String。 通过整合RestTemplateSpring Boot应用程序可以方便地与其他RESTful服务进行交互,并处理返回结果。同时,RestTemplate还提供了其他HTTP请求方法和辅助方法,使得发送HTTP请求变得更加灵活和便捷。 ### 回答3: Spring Boot是一个用于快速开发微服务应用的框架,而RestTemplate则是Spring提供的用于发送HTTP请求的工具类。通过整合RestTemplate,我们可以在Spring Boot应用中轻松地与其他HTTP服务进行通信。 要整合RestTemplate,首先需要在Spring Boot的配置文件中配置RestTemplate的Bean。可以通过在配置类中使用@Bean注解来创建一个RestTemplate的实例。可以根据需要进行自定义配置,比如设置连接超时时间、设置请求头等。 然后,在需要发送HTTP请求的地方,可以直接注入RestTemplate实例并使用其提供的方法来发送请求。例如,可以使用RestTemplate的getForObject()方法发送GET请求,并将响应结果以指定的类型返回。同样地,也可以使用postForObject()方法发送POST请求,并附带请求体。RestTemplate还提供了其他常见的HTTP请求方法,比如put()、delete()等。 在使用RestTemplate时,可以根据需要设置请求的路径、请求参数、请求头等。RestTemplate还支持使用URI模板、URL占位符等灵活的方式来构建请求路径。可以通过使用exchange()方法来发送复杂的请求,并获取完整的响应信息。 另外,整合RestTemplate时还需要注意异常处理。RestTemplate可能会因为网络异常、服务异常等情况下抛出异常,我们可以通过捕获这些异常并进行相应的处理来保证程序的稳定性。 总之,通过Spring Boot整合RestTemplate,我们可以方便地在应用中发送HTTP请求。这对于与其他微服务进行通信、调用外部API等场景非常有用。同时,RestTemplate提供了丰富的功能和灵活的配置选项,可以满足不同场景的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值