Springboot中使用RestTemplate(一种更为优雅的调用RESTful服务的方式)

背景

我们在开发java后端的时候,多多少少会遇到一些需要接受别人数据的时候,那通常这种情况,对面大多数情况下都会使用HTTP的方式来提供接口。按照之前的开发经验,大多数人会采用apache的HttpClient开发,或者使用OKHTTP开发。但这两种方式,都需要很长一段代码(或者我直接复制一个类过来),代码复杂、还要担心资源回收的问题。

RestTemplate是Spring用于同步client端的核心类,简化了与http服务的通信,并满足RestFul原则,程序代码可以给它提供URL,并提取结果。默认情况下,RestTemplate默认依赖jdk的HTTP连接工具。当然你也可以 通过setRequestFactory属性切换到不同的HTTP源,比如Apache HttpComponents、Netty和OkHttp。

RestTemplate使用

引入RestTemplate

RestTemplate是spring的一个rest客户端,在spring-web这个包下,spring boot的依赖如下

  <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

配置RestTemplate类:

package com.deepbluebi.aip.smartoffice.config;
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;
import org.springframework.http.converter.StringHttpMessageConverter;
import java.nio.charset.Charset;
/**
 * 描述:
 *
 * @author xxx
 * @create 2019-07-25-15:55
 */
@Configuration
public class RestTemplateConfig {

    @Bean
    public RestTemplate restTemplate(ClientHttpRequestFactory factory){
        RestTemplate restTemplate= new RestTemplate(factory);
        // 支持中文编码
        restTemplate.getMessageConverters().set(1,
                new StringHttpMessageConverter(Charset.forName("UTF-8")));
        return restTemplate;

    }

    @Bean
    public ClientHttpRequestFactory simpleClientHttpRequestFactory(){
        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
        factory.setReadTimeout(5000);//单位为ms
        factory.setConnectTimeout(5000);//单位为ms
        return factory;
    }
}

配置类其实没啥好说的,大家自己看就行,重点就是如何使用restTemplate

RestTemplate使用

下面我们讲几种最常用的方法:

- Get请求:

getForObjectgetForEntity 这两个方法都是采用get请求去获取数据。
但是 getForObject()其实比getForEntity()多包含了将HTTP转成POJO的功能,但是getForObject没有处理response的能力。因为它拿到手的就是成型的pojo。省略了很多response的信息。
getForEntity
我们可以看到 getForEntity提供了三个方法。
第二个很简单,对应的参数:一个是url地址 ,一个是返回的实体类。
第一个方法 第三个参数是对应的url中带的参数。(不是很懂,所以不常用)
第三个方法(常用):url参数是个Map类。
例子:

		String  url = "http://www.xxxx.com?userId={userId}&begin={begin}&end={end}";
        Map<String,String> map = new HashMap<>();
        map.put("userId", "1");
        map.put("begin", "1");
        map.put("end", "10");
        restTemplate.getForEntity(url, ResponseBean.class,map);

getForObject 和getForEntity 差不都,不多介绍了。
这里还得注重介绍下getForEntity 返回的ResponseEntity 这个类:

		ResponseEntity response = restTemplate.getForEntity(url, ResponseBean.class,map);
		response.getHeaders();		//响应头
		response.getStatusCode();	//响应码
		response.getBody();			//响应体,就是返回内容

- POST请求:

post请求应该是比GET请求还要常用的方法:最常见的就是在post请求中添加 header。
我们先从基本开始看。
POST和GET请求一样也有 postForObjectpostForEntity
post和get的区别就是 post 是把发送的内容放到body里面。那么我们需要先构建body类。也就是
HttpEntity
HttpEntity
我们可以看到HttpEntity有三个构造方法。其中需要注意的是第三个构造方法,其实也很好理解,MultiValueMap 也就使header。
举个例子:

        String url = "http://www.xxxx.com";
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
        MultiValueMap<String, String> map= new LinkedMultiValueMap<>();
        map.add("userId", "3212xxxxxxxxxxxxxx");
        HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(map, headers);
        ResponseEntity<String> response = restTemplate.postForEntity( url, request , String.class );
        System.out.println(response.getBody());

包括返回数据乱码都可以在 header中指定返回类型

通用的exchange 方法:

exchange()方法跟上面的方法不同之处在于它可以指定请求的HTTP类型。
exchange方法有以下几种:
在这里插入图片描述
感觉挺多的,我就不一一介绍了 -。-
举个例子:

 		String yesterdayDate = DateUtil.getPreDateByDate(new Date());
        HttpHeaders headers = new HttpHeaders();
        headers.add("X-API-KEY", XAPIKEY);
        headers.add("X-API-SECRET ", XAPISECRET);
        HashMap<String, String> map = new HashMap<>();
        map.put("edge_channel", edgcChannel);
        map.put("time_begin", yesterdayDate);
        map.put("time_end", yesterdayDate);
        map.put("page_size", pageSize);
        map.put("page_num", String.valueOf(pageNum));
        HttpEntity httpEntity = new HttpEntity(null, headers);
        ResponseEntity<OpPassRecordBean> result = restTemplate.exchange(passRecordUrl, HttpMethod.GET, httpEntity

总结:

从去年到今年隔了有一年才开始更新博客了,去年那个时候也是正好换工作的时候 ,所以忙着换工作也没时间更新,后来找到工作了,刚上班也比较忙,没啥时间来更新(其实就是懒=。=)。最近恢复更新,嘻嘻。

  • 8
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Spring BootRestTemplate是一个用于访问RESTful Web服务的客户端。它提供了一种简单的方式来访问RESTful Web服务,并且可以与Spring框架无缝集成。使用RestTemplate,我们可以发送HTTP请求并接收响应,以便在我们的应用程序使用它们。 使用RestTemplate,我们可以执行以下操作: 1. 发送HTTP GET请求并接收响应。 2. 发送HTTP POST请求并接收响应。 3. 发送HTTP PUT请求并接收响应。 4. 发送HTTP DELETE请求并接收响应。 我们可以使用RestTemplate来访问各种RESTful Web服务,例如Twitter,Facebook,GitHub等。它还支持各种数据格式,例如JSON,XML等。 要使用RestTemplate,我们需要在Spring Boot应用程序添加以下依赖项: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> ``` 然后,我们可以在我们的应用程序创建一个RestTemplate实例,并使用它来发送HTTP请求。例如,以下代码片段演示了如何使用RestTemplate发送HTTP GET请求: ``` RestTemplate restTemplate = new RestTemplate(); String url = "https://api.github.com/users/octocat"; String response = restTemplate.getForObject(url, String.class); System.out.println(response); ``` 在这个例子,我们创建了一个RestTemplate实例,并使用它来发送HTTP GET请求到GitHub API。我们指定了API的URL,并使用getForObject()方法发送请求。该方法返回一个响应对象,我们将其转换为字符串并打印出来。 总之,RestTemplate是一个非常有用的工具,可以帮助我们轻松地访问RESTful Web服务。它是Spring Boot框架的一部分,因此可以与其他Spring组件无缝集成。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值