[Java Framework] [Spring] Spring中RestTemplate中几种常见的请求方式

🍀简介

  • RestTemple是Spring提供的用于访问Http请求的客户端,RestTemple提供了多种简洁的远程访问服务的方法,省去了很多无用的代码。
  • RestTemplate的行为可以通过callback回调方法和配置HttpMessageConverter 来定制,用来把对象封装到HTTP请求体,将响应信息放到一个对象中。
  • 考虑到了RestTemplate类是为了调用REST服务而设计的,因此它的主要方法与REST的基础紧密相连就不足为奇了,后者时HTTP协议的方法:HEAD、GET、POST、PUT、DELETE、OPTIONS例如,RestTemplate类具有headForHeaders()、getForObject()、putForObject(),put()和delete()等方法。
  • RestTemplate 可以看到有很多方法,我们可以提取出主要的几种方法是:
    GET / POST / PUT / DELETE / HEAD / OPTIONS / EXCHANGE / EXECUTE

🍀 方法 / 步骤

📌 实例化RestTemplate

因为RestTemplate是Spirng框架提供的所以只要是一个Springboot项目就不用考虑导包的问题,这些都是提供好的。
​ 但是Spring并没有将其加入SpringBean容器中,需要我们手动加入,因为我们首先创建一个Springboot配置类,再在配置类中将我们的RestTemlate注册到Bean容器中

方法一:

​ 使用Springboot提供的RestTemplateBuilder构造类来构造一个RestTemplate,可以自定义一些连接参数,如:连接超时时间,读取超时时间,还有认证信息等

@Configuration
public class RestTemplateConfig {
    @Bean
    public RestTemplate restTemplate(RestTemplateBuilder builder){
        return builder
                //设置连接超时时间
                .setConnectTimeout(Duration.ofSeconds(5000))
                //设置读取超时时间
                .setReadTimeout(Duration.ofSeconds(5000))
                //设置认证信息
                .basicAuthentication("username","password")
                //设置根路径
                .rootUri("https://api.test.com/")
                //构建
                .build();
    }
	// 或者直接进行实例化
   // return new RestTemplate();
}

方法二:

在项目启动实例化这个方法即可

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

📌 GET请求

Get请求的话可以直接在拼接请求路径后直接拼接参数/app/order/getNumber?name=name,也可以使用占位符/app/order/getNumber?name={name},通过Map来传参,但不能使用LinkedMultiValueMap,否则会报错

public void queryWeather() {
        ResponseEntity<Object> forEntity = restTemplate.getForEntity("https://restapi.amap.com/v3/weather/weatherInfo?city=510100&key=e7a5fa943f706602033b6b329c49fbc6", Object.class);
        System.out.println("状态码:"+forEntity.getStatusCode());
        System.out.println("状态码内容:"+forEntity.getStatusCodeValue());
        HttpHeaders headers = forEntity.getHeaders();
        System.out.println("响应头:"+headers);
        Object body = forEntity.getBody();
        System.out.println("响应内容:"+body);
    }

    String url = "https://xx.xx.com/app/order/getNumber?name={name}";
    Map<String, Object> paramMap = new HashMap<String, Object>();
    paramMap.add("name", "name");
    HttpHeaders headers = new HttpHeaders();
    HttpEntity<MultiValueMap<String, Object>> httpEntity = new HttpEntity<MultiValueMap<String, Object>>(null,headers);
    //使用另一个重载的方法传递参数集合paramMap
    ResponseEntity<String> response = template.exchange(url, HttpMethod.GET, httpEntity, String.class,paramMap);

📌 POST请求

在这里插入图片描述

post请求需要用LinkedMultiValueMap来传递参数
String url = "https://xx.xx.com/app/order/getNumber";
MultiValueMap<String, Object> paramMap = new LinkedMultiValueMap<String, Object>();
paramMap.add("name", "name");
HttpHeaders headers = new HttpHeaders();
//headers可以详细设置请求头中的信息等
//HttpEntity里面包含了请求方和相应方的请求头和请求体,类似于@RequestBody和@ResponseBody
HttpEntity<MultiValueMap<String, Object>> httpEntity = new HttpEntity<MultiValueMap<String, Object>>(paramMap,headers);
ResponseEntity<String> response = template.exchange(url, HttpMethod.POST, httpEntity, String.class)

📌 DELETE

​ 与PUT一样,DELETE方法只有一类

📌 HEADER

HEADER也只有一类方法 : ​ 主要用来发送请求获取响应头部信息,但是像DELETE、PUT这类没有响应的方法,是不能使用该方法的(因为没有响应也就没有响应头了)。

  • public HttpHeaders headForHeaders()

📌 OPTIONS

​ 该方法的主要用来判断该服务地址,能够使用那种方法去执行

  • public Set optionsForAllow()
	@Test
    void contextLoads() {
        //请求地址
        String url = "http://httpbin.org/get";
        Set<HttpMethod> httpMethods = restTemplate.optionsForAllow(url);
        System.out.println(httpMethods);
    }

📌 EXCHANGE

  • ResponseEntity exchange()
  • ​ 该接口与其他接口不同:
  1. 该方法允许用户指定请求的方法(get,post,put等)
  2. 可以在请求中增加body以及头信息,其内容通过参数HttpEntity<?> requestEntity描述
  3. exchange支持’含参数的类型(即泛型)'作为返回类型,该特性通通ParameterizedTypeReferenceresponseType 描述
  • 该方法支持五个参数
    服务地址 / 请求方法 / 写入的请求实体 / 响应内容的类型 / 扩展模板的变量或包含URI模板变量的映射
@Test
void contextLoads() {
    //请求地址
    String url = "http://httpbin.org/post";
    User user = new User();
    user.setName("彭于晏");
    HttpHeaders httpHeaders = new HttpHeaders();
    httpHeaders.setContentType(MediaType.APPLICATION_JSON);
    HttpEntity<User> userHttpEntity = new HttpEntity<>(user, httpHeaders);
    ResponseEntity<Object> exchange = restTemplate.exchange(url, HttpMethod.POST, userHttpEntity, Object.class);
    System.out.println(exchange);
}

​ 上述代码模拟了一个简单的POST请求 可以理解为可以动态的指定请求方法和请求实体的一个方法

exchange(String url, HttpMethod method,@Nullable HttpEntity<?> requestEntity, Class responseType, Map

  • 参数说明:
    url:请求路径
    method:请求的方法(GET、POST、PUT等)
    requestEntity:HttpEntity对象,封装了请求头和请求体
    responseType:返回数据类型
    uriVariables:支持PathVariable类型的数据。

java的 RestTemplate中的exchange()方法 允许指定 post, get等方法,比 execute()方法应用更广

📌 EXECUTE

  • T execute()

​ 该方法就是执行请求的方法,我们可以发现上述的所有方法的最后执行都是调用的该方法执行;

  • 该方法支持五个参数
    服务URL地址 / 请求方法 / 准备请求的对象(requestCallback) / 从响应中提取返回值的对象 / 扩展模板的变量或包含URI模板变量的映射

🍀 总结

  • get和post请求适合用在不许要校验直接获取的接口, 如果想获取http协议报文的内容可以使用 xxxForEntity,如果只关注传输数据本身可以使用xxxForObjec
  • DELETE ,HEAD, OPTIONS 可以补充部分信息
  • EXCHANGE 使用频率较高
  • EXECUTE 上面所有方法的最后执行都是调用的该方法执行

🍀 参考资料 & 致谢

RestTemplate

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

OxYGC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值