RestTemplate

RestTemplate

由于我的项目需要做一个定位的功能,打算引用百度的API来进行地址的查询。因为要调用那个API需要百度开发者的密钥key,我不打算直接让前端使用key直接在前端进行调用,因为我认为这样会导致我的密钥的泄漏。所以打算把调用API这一步封装在自己的Service层里。

常用的方式是HttpClient,但我觉得有点麻烦,而且代码篇幅有点长,比较零散。就想着万能的spring有没有什么好的解决方案。一看还真有,spring框架提供的RestTemplate类可用于在应用中调用rest服务,它简化了与http服务的通信方式,统一了RESTful的标准,封装了http链接, 我们只需要传入url及返回值类型即可。相较于之前常用的HttpClient,RestTemplate是一种更优雅的调用RESTful服务的方式。

首先看名字就能感觉很眼熟,跟spring的其他模版类JdbcTemplate,RedisTemplate等差不多,都是为复杂的process提供简化易懂的方法。

配置

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

这是最简单的配置方式,直接返回就好,如果要根据自己的需要来配置的话,引入一个RestTemplateBuilder类的参数,用builder来创建一个模版类。

GET请求

restTemplate提供了两个get请求的方法,一个是getForEntity,一个是getForObject。

getForEntity

getForEntity 方法的返回值是一个ResponseEntity<T>

ResponseEntity<T>是 Spring 对 HTTP 请求响应的封装,包括了几个重要的元素,如响应码、contentType、contentLength、响应消息体等。

使用ResponseEntity作为controller的返回值,我们可以方便地处理响应的header,状态码以及body。而通常使用的@ResponseBody注解,只能处理body部分。这也是为什么通常在下载场景中会使用ResponseEntity,因为下载需要设置header里的content-type以及特殊的status(比如206)。

ResponseEntity其实可以看做是把HttpServletResponse封装了,但是功能比HttpServletResponse多,我是推荐在spring中使用的。

在这里插入图片描述

  • 第一个参数是请求的URL,可以使用拼接字符串的方式设置请求参数。
  • 第二个参数是期望得到响应的body的类型,一般是String.class就行,也可以填入实体类让spring来自动装配。

请求参数的设置方式有三种:

  1. 直接拼接字符串URL。

  2. 设置占位符

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

    Map<String, String> map = new HashMap<>();
    map.put("name", "李四");
    ResponseEntity<String> responseEntity = restTemplate.getForEntity("http://HELLO-SERVICE/sayhello?name={name}", String.class, map);
    
getForObject

与上面那个方法差别不大,只是返回的对象是响应的body。实际上是对Entity的一个封装。

POST请求

postForEntity

与getForEntity的差别主要就是参数位置的差异

  • 方法的第一参数表示要调用的服务的地址
  • 方法的第二个参数表示上传的参数
  • 方法的第三个参数表示返回的消息体的数据类型
public User getUser() {
    User user = new User();
    User.setName("wzl");
    ResponseEntity<User> responseEntity = restTemplate.postForEntity("xxxxxxxxxxxxxxxxxx", user, com.wzl.market.pojo.User.class);
    return responseEntity.getBody();
}
postForObject

注意参数的位置之外和getForObject没什么太大差别。

PUT请求

既然是名字里带了REST,那肯定是还支持RESTful风格的请求的。

因为是put操作,所以restTemplate里面的put请求方法是没有返回值的。别的和post请求一样。

DELETE请求

和get也没什么差别,就是不用填返回响应体的类型参数了。

restTemplate.delete("xxxxxxxxxxxx/{1}", 100);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RestTemplate是一个用于发送HTTP请求的Spring框架类。它提供了一组方便的方法来执行HTTP请求并处理响应。使用RestTemplate可以方便地调用RESTful接口,并处理返回的结果。 在使用RestTemplate时,你可以通过查看RestTemplate的源代码和进行debug跟踪来更好地理解它的使用方法和内部实现。 例如,你可以使用RestTemplate的postForObject方法来发送一个POST请求并获取响应的结果。你需要指定请求的URL、请求体和响应类型,并通过调用postForObject方法来发送请求,并将响应的结果转换为指定的类型。 在创建RestTemplate实例时,你可以通过使用OkHttp3ClientHttpRequestFactory来使用OkHttp作为底层的HTTP客户端。这样可以提供更好的性能和更多的功能。 总之,RestTemplate是一个非常方便易用的类,可以帮助你发送HTTP请求并处理响应。你可以通过查看源码和进行debug跟踪来更好地掌握它的使用方法。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [一文吃透接口调用神器RestTemplate](https://blog.csdn.net/likun557/article/details/121072832)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值