文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

SpringBoot中如何使用HTTP客户端工具Retrofit

2023-07-02 09:31

关注

今天小编给大家分享一下SpringBoot中如何使用HTTP客户端工具Retrofit的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

简介

Retrofit是适用于AndroidJava且类型安全的HTTP客户端工具,在Github上已经有39k+Star。其最大的特性的是支持通过接口的方式发起HTTP请求,类似于我们用Feign调用微服务接口的那种方式。

SpringBoot中如何使用HTTP客户端工具Retrofit

SpringBoot是使用最广泛的Java开发框架,但是Retrofit官方并没有提供专门的Starter。于是有位老哥就开发了retrofit-spring-boot-starter,它实现了Retrofit与SpringBoot框架的快速整合,并且支持了诸多功能增强,极大简化开发。今天我们将使用这个第三方Starter来操作Retrofit。

SpringBoot中如何使用HTTP客户端工具Retrofit

使用

在SpringBoot中使用Retrofit是非常简单的,下面我们就来体验下。

依赖集成

有了第三方Starter的支持,集成Retrofit仅需一步,添加如下依赖即可。

<!--Retrofit依赖--><dependency>    <groupId>com.github.lianjiatech</groupId>    <artifactId>retrofit-spring-boot-starter</artifactId>    <version>2.2.18</version></dependency>

基本使用

下面以调用mall-tiny-swagger中的接口为例,我们来体验下Retrofit的基本使用。

首先我们准备一个服务来方便远程调用,使用的是之前的mall-tiny-swagger这个Demo,打开Swagger看下,里面有一个登录接口和需要登录认证的商品品牌CRUD接口,

SpringBoot中如何使用HTTP客户端工具Retrofit

我们先来调用下登录接口试试,在application.yml中配置好mall-tiny-swagger的服务地址;

remote:  baseUrl: http://localhost:8088/

再通过@RetrofitClient声明一个Retrofit客户端,由于登录接口是通过POST表单形式调用的,这里使用到了@POST@FormUrlEncoded注解;

@RetrofitClient(baseUrl = "${remote.baseUrl}")public interface UmsAdminApi {    @FormUrlEncoded    @POST("admin/login")    CommonResult<LoginInfo> login(@Field("username") String username, @Field("password") String password);}

如果你不太明白这些注解是干嘛的,看下下面的表基本就懂了,更具体的话可以参考Retrofit官方文档;

SpringBoot中如何使用HTTP客户端工具Retrofit

接下来在Controller中注入UmsAdminApi,然后进行调用即可;

@Api(tags = "RetrofitController", description = "Retrofit测试接口")@RestController@RequestMapping("/retrofit")public class RetrofitController {    @Autowired    private UmsAdminApi umsAdminApi;    @Autowired    private TokenHolder tokenHolder;    @ApiOperation(value = "调用远程登录接口获取token")    @PostMapping(value = "/admin/login")    public CommonResult<LoginInfo> login(@RequestParam String username, @RequestParam String password) {        CommonResult<LoginInfo> result = umsAdminApi.login(username, password);        LoginInfo loginInfo = result.getData();        if (result.getData() != null) {            tokenHolder.putToken(loginInfo.getTokenHead() + " " + loginInfo.getToken());        }        return result;    }}

为方便后续调用需要登录认证的接口,我创建了TokenHolder这个类,把token存储到了Session中;

@Componentpublic class TokenHolder {        public void putToken(String token) {        RequestAttributes ra = RequestContextHolder.getRequestAttributes();        HttpServletRequest request = ((ServletRequestAttributes) ra).getRequest();        request.getSession().setAttribute("token", token);    }        public String getToken() {        RequestAttributes ra = RequestContextHolder.getRequestAttributes();        HttpServletRequest request = ((ServletRequestAttributes) ra).getRequest();        Object token = request.getSession().getAttribute("token");        if(token!=null){            return (String) token;        }        return null;    }}

接下来通过Swagger进行测试,调用接口就可以获取到远程服务返回的token了,访问地址:http://localhost:8086/swagger-ui/

SpringBoot中如何使用HTTP客户端工具Retrofit

注解式拦截器

商品品牌管理接口,需要添加登录认证头才可以正常访问,我们可以使用Retrofit中的注解式拦截器来实现。

首先创建一个注解式拦截器TokenInterceptor继承BasePathMatchInterceptor,然后在doIntercept方法中给请求添加Authorization头;

@Componentpublic class TokenInterceptor extends BasePathMatchInterceptor {    @Autowired    private TokenHolder tokenHolder;    @Override    protected Response doIntercept(Chain chain) throws IOException {        Request request = chain.request();        if (tokenHolder.getToken() != null) {            request = request.newBuilder()                    .header("Authorization", tokenHolder.getToken())                    .build();        }        return chain.proceed(request);    }}

创建调用品牌管理接口的客户端PmsBrandApi,使用@Intercept注解配置拦截器和拦截路径;

@RetrofitClient(baseUrl = "${remote.baseUrl}")@Intercept(handler = TokenInterceptor.class, include = "/brand@Api(tags = "RetrofitController", description = "Retrofit测试接口")@RestController@RequestMapping("/retrofit")public class RetrofitController {    @Autowired    private PmsBrandApi pmsBrandApi;    @ApiOperation("调用远程接口分页查询品牌列表")    @GetMapping(value = "/brand/list")    public CommonResult<CommonPage<PmsBrand>> listBrand(@RequestParam(value = "pageNum", defaultValue = "1")                                                        @ApiParam("页码") Integer pageNum,                                                        @RequestParam(value = "pageSize", defaultValue = "3")                                                        @ApiParam("每页数量") Integer pageSize) {        return pmsBrandApi.list(pageNum, pageSize);    }    @ApiOperation("调用远程接口获取指定id的品牌详情")    @GetMapping(value = "/brand/{id}")    public CommonResult<PmsBrand> brand(@PathVariable("id") Long id) {        return pmsBrandApi.detail(id);    }    @ApiOperation("调用远程接口添加品牌")    @PostMapping(value = "/brand/create")    public CommonResult createBrand(@RequestBody PmsBrand pmsBrand) {        return pmsBrandApi.create(pmsBrand);    }    @ApiOperation("调用远程接口更新指定id品牌信息")    @PostMapping(value = "/brand/update/{id}")    public CommonResult updateBrand(@PathVariable("id") Long id, @RequestBody PmsBrand pmsBrand) {        return pmsBrandApi.update(id,pmsBrand);    }    @ApiOperation("调用远程接口删除指定id的品牌")    @GetMapping(value = "/delete/{id}")    public CommonResult deleteBrand(@PathVariable("id") Long id) {        return  pmsBrandApi.delete(id);    }}

在Swagger中调用接口进行测试,发现已经可以成功调用。

SpringBoot中如何使用HTTP客户端工具Retrofit

全局拦截器

如果你想给所有请求都加个请求头的话,可以使用全局拦截器。

创建SourceInterceptor类继承BaseGlobalInterceptor接口,然后在Header中添加source请求头。

@Componentpublic class SourceInterceptor extends BaseGlobalInterceptor {    @Override    protected Response doIntercept(Chain chain) throws IOException {        Request request = chain.request();        Request newReq = request.newBuilder()                .addHeader("source", "retrofit")                .build();        return chain.proceed(newReq);    }}

配置

Retrofit的配置很多,下面我们讲讲日志打印、全局超时时间和全局请求重试这三种最常用的配置。

日志打印 默认配置下Retrofit使用basic日志策略,打印的日志非常简单;

SpringBoot中如何使用HTTP客户端工具Retrofit

我们可以将application.yml中的retrofit.global-log-strategy属性修改为body来打印最全日志;

retrofit:  # 日志打印配置  log:    # 启用日志打印    enable: true    # 日志打印拦截器    logging-interceptor: com.github.lianjiatech.retrofit.spring.boot.interceptor.DefaultLoggingInterceptor    # 全局日志打印级别    global-log-level: info    # 全局日志打印策略    global-log-strategy: body

修改日志打印策略后,日志信息更全面了;

SpringBoot中如何使用HTTP客户端工具Retrofit

Retrofit支持四种日志打印策略;

全局超时时间

有时候我们需要修改一下Retrofit的请求超时时间,可以通过如下配置实现。

retrofit:  # 全局连接超时时间  global-connect-timeout-ms: 3000  # 全局读取超时时间  global-read-timeout-ms: 3000  # 全局写入超时时间  global-write-timeout-ms: 35000  # 全局完整调用超时时间  global-call-timeout-ms: 0

全局请求重试

retrofit-spring-boot-starter支持请求重试,可以通过如下配置实现。

retrofit:  # 重试配置  retry:    # 是否启用全局重试    enable-global-retry: true    # 全局重试间隔时间    global-interval-ms: 100    # 全局最大重试次数    global-max-retries: 2    # 全局重试规则    global-retry-rules:      - response_status_not_2xx      - occur_exception    # 重试拦截器    retry-interceptor: com.github.lianjiatech.retrofit.spring.boot.retry.DefaultRetryInterceptor

重试规则global-retry-rules支持如下三种配置。

以上就是“SpringBoot中如何使用HTTP客户端工具Retrofit”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯