SpringBoot之RestTemplate

官网

Spring RestTemplate中几种常见的请求方式

需求:通过 RestTemplate 从接口获取数据,然后写入数据库同时保存该数据副本到服务器

由于之前并没有怎么使用过 RestTemplate请求数据,只是用过 Feign 去跨服务调用。。看来我太菜了哈哈。

实现

我发现设置请求body的时候有许多重复的代码,于是我就用 builder模式 改造了下

登录获取token

//登录获取token
//--loginKey转成Base64的格式
String dataStr = RestConstant.BIG_SCREEN_TOKEN + DateUtils.dateToStamp();
String loginKey = Base64Utils.encodeToString(dataStr.getBytes());
//--body
MultiValueMap<String, String> requestTokenBody = new RequestBody.RequestBodyBuilder()
    .setGrantType("xxx")
    .setAuthType("xxx")
    .setLoginKey(loginKey)
    .build().getRequestBody();

HttpEntity requestEntity = new HttpEntity(requestTokenBody,null);
//--获取 accessToken
ResponseEntity<String> responseEntity = restTemplate.postForEntity("http://"+url + "/login/bigScreen", requestEntity, String.class);

builder 模式

public class RequestBody {

    private MultiValueMap<String, String> requestBody;

    public MultiValueMap<String, String> getRequestBody() {
        return requestBody;
    }

    public RequestBody(RequestBodyBuilder builder) {

        this.requestBody = builder.requestBody;
    }

    public static class RequestBodyBuilder{
        private String grantType;
        private String authType;
        private MultiValueMap<String, String> requestBody;

        public RequestBodyBuilder() {
            this.requestBody = new LinkedMultiValueMap<>();
        }

        public RequestBodyBuilder setGrantType(String grantType) {
            this.requestBody.add("xxx",grantType);
            return this;
        }

        public RequestBodyBuilder setAuthType(String authType) {
            this.requestBody.add("xxx",authType);
            return this;
        }

        public RequestBody build(){

            return new RequestBody(this);
        }
    }
}

GET 请求

在RestTemplate中,发送一个GET请求,我们可以通过如下两种方式:

第一种:getForEntity

getForEntity方法的返回值是一个ResponseEntity,ResponseEntity是Spring对HTTP请求响应的封装,包括了几个重要的元素,如响应码、contentType、contentLength、响应消息体等。比如下面一个例子:

ResponseEntity<String> responseEntity = restTemplate.getForEntity("http://HELLO-SERVICE/hello", String.class);
  • 第一个参数为要调用的服务的地址,这里我调用了服务提供者提供的/hello接口,注意这里是通过服务名调用而不是服务地址,如果写成服务地址就没法实现客户端负载均衡了。
  • 第二个参数String.class表示希望返回的body类型是String

有时候我在调用服务提供者提供的接口时,可能需要传递参数,有两种不同的方式,如下:

ResponseEntity<String> responseEntity = restTemplate.getForEntity("http://HELLO-SERVICE/sayhello?name={1}", String.class, "张三");

//
ResponseEntity<String> responseEntity = restTemplate.getForEntity("http://HELLO-SERVICE/sayhello?name={name}", String.class, map);
  • 可以用一个数字做占位符,最后是一个可变长度的参数,来一一替换前面的占位符
  • 也可以前面使用name={name}这种形式,最后一个参数是一个map,map的key即为前边占位符的名字,map的value为参数值

第二种:getForObject

getForObject函数实际上是对getForEntity函数的进一步封装,如果你只关注返回的消息体的内容,对其他信息都不关注,此时可以使用getForObject,举一个简单的例子,如下:

@RequestMapping("/book2")
public Book book2() {
    Book book = restTemplate.getForObject("http://HELLO-SERVICE/getbook1", Book.class);
    return book;
}

POST请求

在 RestTemplate 中,POST 请求可以通过如下三个方法发起:

第一种:postForEntity

@RequestMapping("/book3")
public Book book3() {
    Book book = new Book();
    book.setName("红楼梦");
    ResponseEntity<Book> responseEntity = restTemplate.postForEntity("http://HELLO-SERVICE/getbook2", book, Book.class);
    return responseEntity.getBody();
}
  • 第一个参数表示要调用服务的地址
  • 第二个参数表示上传的参数
  • 第三个参数表示返回的消息体的数据类型

我这里创建了一个Book对象,这个Book对象只有name属性有值,将之传递到服务提供者那里去,服务提供者代码如下:

@RequestMapping(value = "/getbook2", method = RequestMethod.POST)
public Book book2(@RequestBody Book book) {
    System.out.println(book.getName());
    book.setPrice(33);
    book.setAuthor("曹雪芹");
    book.setPublisher("人民文学出版社");
    return book;
}

第二种:postForObject

如果你只关注,返回的消息体,可以直接使用postForObject。用法和getForObject一致。

第三种:postForLocation

postForLocation也是提交新资源,提交成功之后,返回新资源的URI,postForLocation的参数和前面两种的参数基本一致,只不过该方法的返回值为Uri,这个只需要服务提供者返回一个Uri即可,该Uri表示新资源的位置。

PUT 请求

在RestTemplate中,PUT请求可以通过put方法调用,put方法的参数和前面介绍的postForEntity方法的参数基本一致,只是put方法没有返回值而已。举一个简单的例子,如下:

@RequestMapping("/put")
public void put() {
    Book book = new Book();
    book.setName("红楼梦");
    restTemplate.put("http://HELLO-SERVICE/getbook3/{1}", book, 99);
}

book对象是我要提交的参数,最后的99用来替换前面的占位符{1}

DELETE请求

delete请求我们可以通过delete方法调用来实现,如下例子:

@RequestMapping("/delete")
public void delete() {
    restTemplate.delete("http://HELLO-SERVICE/getbook4/{1}", 100);
}

底层原理

todo:未完待续…

<think>首先,用户的问题是:“我想查找Spring Boot中RestTemplate的配置方法 请问Spring Boot中RestTemplate的配置”。这是在询问如何在Spring Boot中配置RestTemplate。 从系统指令中,我需要: - 使用中文回答。 - 生成相关问题。 - 回答结构清晰,逐步解决问题。 - 引用的段落末尾自然地添加引用标识。 - 确保真实可靠。 用户提供了几个引用: - 引用[1]:解释了Spring Boot自动配置RestTemplateBuilder,并通过它创建RestTemplate。示例代码展示了在服务类中使用RestTemplateBuilder构建RestTemplate。 - 引用[2]:展示了通过@Configuration类配置RestTemplate,自定义ClientHttpRequestFactory来设置超时等属性。 - 引用[3]:提到引入依赖,如okhttp,但没有给出具体的配置代码。 - 引用[4]:描述了各种HttpMessageConverter的支持类型。 用户说这些引用仅供参考,不是真实需求,我需要基于用户的问题回答。 用户上一次的问题是关于RestTemplate的配置,所以我应该直接回答如何配置。 关键点总结: 1. **Spring Boot自动配置**:Spring Boot通过RestTemplateAutoConfiguration自动提供一个RestTemplateBuilder bean。用户可以直接注入这个builder来创建RestTemplate实例。 2. **自定义配置**:用户可以通过定义自己的@Configuration类来定制RestTemplate,例如设置超时、添加拦截器或自定义消息转换器。 3. **依赖**:RestTemplate是spring-boot-starter-web的一部分,所以不需要额外添加依赖,除非用户想使用特定的HTTP客户端如OkHttp。 结构化回答: 1. **介绍RestTemplate和Spring Boot的自动配置**:简要解释什么是RestTemplate,以及Spring Boot如何简化其配置。 2. **基本配置方法**: - 使用RestTemplateBuilder:注入builder并构建RestTemplate。 - 示例代码基于引用[1]。 3. **自定义配置方法**: - 通过@Configuration类定义RestTemplate bean。 - 示例代码基于引用[2],设置连接和读取超时。 4. **高级配置**: - 添加消息转换器(参考引用[4])。 - 使用其他HTTP客户端如OkHttp(参考引用[3])。 5. **注意事项**:确保依赖正确。 生成相关问题: - 按照指令,在回答结束时生成相关问题。 - 相关问题应基于主题,如优化、常见问题等。 添加引用标识: - 在回答中引用具体的段落时,如提到示例代码,添加像[^1]这样的标识。 - 引用基于用户提供的引用索引。 回答结构: - 逐步解决问题:先介绍基本用法,再深入自定义配置。 - 使用中文。 最终回答结构: 1. 开头:解释配置方法。 2. 分步说明: - 方法1:使用RestTemplateBuilder。 - 方法2:自定义@Configuration。 - 方法3:高级定制。 3. 代码示例。 4. 总结。 5. 相关问题。 </think>以下解答基于您查询的Spring Boot中RestTemplate配置方法。Spring Boot通过自动配置简化了RestTemplate的使用,但您可以根据需求灵活定制。RestTemplate是Spring Web模块提供的HTTP客户端工具,用于发送RESTful请求。配置方法主要包括两种:**自动配置(推荐)**和**手动自定义配置**。我将逐步说明配置步骤并提供代码示例,确保真实可靠(参考Spring Boot官方文档和常见实践)。回答末尾附有相关问题供深入探索。 ### 1. **Spring Boot自动配置(简化方式)** Spring Boot默认通过`RestTemplateAutoConfiguration`自动提供一个`RestTemplateBuilder` bean。您只需注入该builder,即可轻松创建和配置RestTemplate实例。这是最常用的方式,适合大多数场景(如简单HTTP请求)。 - **步骤**: 1. 在Spring组件(如@Service或@Controller)中注入`RestTemplateBuilder`。 2. 调用`build()`方法创建`RestTemplate`对象。 3. 直接使用RestTemplate发送请求。 - **示例代码**(基于引用[1]): ```java import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.springframework.boot.web.client.RestTemplateBuilder; @Component public class ApiService { private final RestTemplate restTemplate; // 注入RestTemplateBuilder,Spring Boot自动配置 public ApiService(RestTemplateBuilder restTemplateBuilder) { this.restTemplate = restTemplateBuilder.build(); // 创建RestTemplate实例 } public String fetchData() { // 使用RestTemplate发送GET请求 String response = restTemplate.getForObject("https://jsonplaceholder.typicode.com/posts/1", String.class); return response; } } ``` - **优点**:无需额外配置,Spring Boot自动处理依赖和基础设置。 - **注意事项**:确保项目中已引入`spring-boot-starter-web`依赖(默认包含RestTemplate)。如果您使用Maven,在`pom.xml`中添加: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> ``` - **适用场景**:快速开发、不需要定制超时或拦截器的简单应用[^1]。 ### 2. **手动自定义配置(高级定制)** 如果需要更精细的控制(如设置超时、添加消息转换器或使用特定HTTP客户端),可以通过自定义`@Configuration`类定义RestTemplate bean。这种方式允许您覆盖默认配置。 - **步骤**: 1. 创建一个配置类(如`RestTemplateConfig`),标注`@Configuration`。 2. 使用`@Bean`定义RestTemplate,并注入工厂类(如`ClientHttpRequestFactory`)来设置属性。 3. 可选:添加消息转换器(MessageConverter)或拦截器。 - **示例代码**(基于引用[2]和[4],设置连接超时和读取超时): ```java import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.client.ClientHttpRequestFactory; import org.springframework.http.client.SimpleClientHttpRequestFactory; import org.springframework.web.client.RestTemplate; @Configuration public class RestTemplateConfig { // 定义RestTemplate bean,使用自定义工厂 @Bean public RestTemplate restTemplate(ClientHttpRequestFactory factory) { RestTemplate restTemplate = new RestTemplate(factory); // 可选:添加消息转换器(如支持JSON/XML,引用[4]列出默认转换器) // restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter()); return restTemplate; } // 配置HTTP请求工厂,设置超时 @Bean public ClientHttpRequestFactory simpleClientHttpRequestFactory() { SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); factory.setConnectTimeout(15000); // 连接超时15秒 factory.setReadTimeout(5000); // 读取超时5秒 return factory; } } ``` - **关键配置选项**: - **超时设置**:`setConnectTimeout()`(连接超时)、`setReadTimeout()`(读取超时)。 - **消息转换器**:RestTemplate默认支持多种格式(如JSON、XML),可通过`getMessageConverters()`添加自定义转换器(参考引用[4],例如添加FastJson转换器)。 - **HTTP客户端**:如果需要高性能客户端(如OkHttp),需额外引入依赖并配置工厂(引用[3]提供依赖示例): - 在`pom.xml`添加依赖: ```xml <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> </dependency> ``` - 在配置类中使用`OkHttp3ClientHttpRequestFactory`替代`SimpleClientHttpRequestFactory`。 - **优点**:高度可控,适合生产环境(如微服务调用)。 - **注意事项**:自定义配置会覆盖自动配置,确保在需要时使用[^2][^4]。 ### 3. **配置总结与最佳实践** - **推荐方法**:优先使用自动配置(`RestTemplateBuilder`),除非需定制超时或转换器。 - **依赖检查**:Spring Boot 3.x起,RestTemplate已被标记为“过时”,建议迁移到`WebClient`(响应式客户端),但RestTemplate仍广泛使用。确保Spring Boot版本兼容(如2.x)。 - **常见问题**: - 如果RestTemplate无法注入,检查是否缺少`spring-boot-starter-web`。 - 超时设置可预防网络故障,生产环境建议配置(如连接超时10-30秒)。 - **安全提示**:避免在RestTemplate中硬编码敏感URL,使用配置属性(如`@Value`)。 综上所述,Spring Boot中RestTemplate的配置灵活且易上手:自动配置适合快速开发,手动配置支持深度定制[^1][^2][^4]。如果您提供更多细节(如具体需求或错误信息),我可进一步优化建议。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值