展开菜单
首页 精品内容 本月促销 装机必备 Windows PDF教程 macOS软件 IOS软件 Android AI 专题
全部分类

当前位置:

首页 > 编程开发 > SpringBoot中如何使用HTTP客户端工具Retrofit

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

简介Retrofit是适用于Android和Java且类型安全的HTTP客户端工具,在Github上已经有39k+Star。其最大的特性的是支持通过接口的方式发起HTTP请求,类似于我们用Feign调用微服务接口的那种方式。SpringBoot是使用最广泛的Java开发框架,但是Retrofit官方并没有提供专门的Starter。于是有位老哥就开发了retrofit-spring-boot-starter,它实现了Retrofit与SpringBoot框架的快速整合,并且支持了诸多功能增强,极大简化开发。

本文目录

    简介

    Retrofit是适用于Android和Java且类型安全的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仅需一步,添加如下依赖即可。

    
    
        com.github.lianjiatech
        retrofit-spring-boot-starter
        2.2.18
    

    基本使用

    下面以调用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注解;

    /**
     * 定义Http接口,用于调用远程的UmsAdmin服务
     * Created by macro on 2022/1/19.
     */
    @RetrofitClient(baseUrl = "${remote.baseUrl}")
    public interface UmsAdminApi {
        @FormUrlEncoded
        @POST("admin/login")
        CommonResult login(@Field("username") String username, @Field("password") String password);
    }

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

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

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

    /**
     * Retrofit测试接口
     * Created by macro on 2022/1/19.
     */
    @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 login(@RequestParam String username, @RequestParam String password) {
            CommonResult result = umsAdminApi.login(username, password);
            LoginInfo loginInfo = result.getData();
            if (result.getData() != null) {
                tokenHolder.putToken(loginInfo.getTokenHead() + " " + loginInfo.getToken());
            }
            return result;
        }
    }

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

    /**
     * 登录token存储(在Session中)
     * Created by macro on 2022/1/19.
     */
    @Component
    public class TokenHolder {
        /**
         * 添加token
         */
        public void putToken(String token) {
            RequestAttributes ra = RequestContextHolder.getRequestAttributes();
            HttpServletRequest request = ((ServletRequestAttributes) ra).getRequest();
            request.getSession().setAttribute("token", 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头;

    /**
     * 给请求添加登录Token头的拦截器
     * Created by macro on 2022/1/19.
     */
    @Component
    public 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注解配置拦截器和拦截路径;

    /**
     * 定义Http接口,用于调用远程的PmsBrand服务
     * Created by macro on 2022/1/19.
     */
    @RetrofitClient(baseUrl = "${remote.baseUrl}")
    @Intercept(handler = TokenInterceptor.class, include = "/brand/**")
    public interface PmsBrandApi {
        @GET("brand/list")
        CommonResult> list(@Query("pageNum") Integer pageNum, @Query("pageSize") Integer pageSize);
        @GET("brand/{id}")
        CommonResult detail(@Path("id") Long id);
        @POST("brand/create")
        CommonResult create(@Body PmsBrand pmsBrand);
        @POST("brand/update/{id}")
        CommonResult update(@Path("id") Long id, @Body PmsBrand pmsBrand);
        @GET("brand/delete/{id}")
        CommonResult delete(@Path("id") Long id);
    }

    再在Controller中注入PmsBrandApi实例,并添加方法调用远程服务即可;

    /**
     * Retrofit测试接口
     * Created by macro on 2022/1/19.
     */
    @Api(tags = "RetrofitController", description = "Retrofit测试接口")
    @RestController
    @RequestMapping("/retrofit")
    public class RetrofitController {
        @Autowired
        private PmsBrandApi pmsBrandApi;
        @ApiOperation("调用远程接口分页查询品牌列表")
        @GetMapping(value = "/brand/list")
        public CommonResult> 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 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请求头。

    /**
     * 全局拦截器,给请求添加source头
     * Created by macro on 2022/1/19.
     */
    @Component
    public 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支持四种日志打印策略;

    • NONE:不打印日志;

    • BASIC:只打印日志请求记录;

    • HEADERS:打印日志请求记录、请求和响应头信息;

    • BODY:打印日志请求记录、请求和响应头信息、请求和响应体信息。

    全局超时时间

    有时候我们需要修改一下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支持如下三种配置。

    • RESPONSE_STATUS_NOT_2XX:响应状态码不是2xx时执行重试;

    • OCCUR_IO_EXCEPTION:发生IO异常时执行重试;

    • OCCUR_EXCEPTION:发生任意异常时执行重试。

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发
    相关文章 更多
    精品专题 更多
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    macOS软件

    正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

    IOS软件

    正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

    AI

    正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

    Mac软件 更多
    Aperty macOS版
    Aperty macOS版

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    火山引擎 网页版
    火山引擎 网页版

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    立刻MV 网页版
    立刻MV 网页版

    立刻MV 面向音乐人、内容创作者和品牌团队,帮助用户低成本完成歌曲 MV、歌词视频、AI 分镜、图生视频与最终合成。

    蛙蛙写作 网页版
    蛙蛙写作 网页版

    蛙蛙写作 AI 创作工具,覆盖小说、剧本、文案,一键生成文稿,打通文字转视频全流程,高效解决创作难题。

    讯飞智作 网页版
    讯飞智作 网页版

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    超级简历WonderCV 网页版
    超级简历WonderCV 网页版

    超级简历WonderCV是面向应届生和AI小白的智能求职平台,覆盖简历、面试与职业规划。

    音述AI 网页版
    音述AI 网页版

    音述AI,是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区。

    AionClaw macOS版
    AionClaw macOS版

    AionClaw 是可在桌面端运行的任务型 AI 助手,通过数字专家与技能市场组合办公、创作、数据和开发能力。

    Loomy macOS版
    Loomy macOS版

    Loomy 是科大讯飞推出的桌面 AI 助手,可通过对话、任务与工作目录协助处理办公、内容创作和资料整理。

    AirBuddy 3 macOS版
    AirBuddy 3 macOS版

    AirBuddy 3 是面向 macOS 的蓝牙外设增强工具,可集中查看 AirPods、Beats 与苹果设备电量,提供快速连接、播放控制、电量提醒、桌面小组件和多台 Mac 外设接力等功能。

    AirServer macOS版
    AirServer macOS版

    AirServer macOS版可把 Mac 转换为无线投屏接收端,通过 AirPlay 或 Google Cast 接收手机、平板和电脑画面,并支持多设备同时连接、高清镜像及会话录制,适合家庭娱乐、课堂教学、会议演示和应用展示。

    AnyDesk macOS版
    AnyDesk macOS版

    AnyDesk macOS版是一款适用于远程办公、设备维护和客户支持的远程桌面工具,可连接并操作异地计算机,支持文件传输、无人值守访问、会话权限控制及跨平台协作。

    WINDOWS 更多
    讯飞绘文 网页版
    讯飞绘文 网页版

    讯飞绘文网页版是科大讯飞推出的AI图文创作与内容运营工具,覆盖热点选题、文章生成、稿件校对、智能配图、排版发布和数据复盘等环节,适合自媒体创作者及内容团队在线使用。

    Maya(Autodesk Maya) Windows版
    Maya(Autodesk Maya) Windows版

    Autodesk Maya 是面向影视、电视、动画和游戏行业的专业三维制作软件,集多边形与 NURBS 建模、角色绑定、关键帧和动作捕捉动画、Bifrost 特效模拟、材质开发及 Arnold 渲染于一体,

    Aperty Windows版
    Aperty Windows版

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    火山引擎 网页版
    火山引擎 网页版

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    立刻MV 网页版
    立刻MV 网页版

    立刻MV 面向音乐人、内容创作者和品牌团队,帮助用户低成本完成歌曲 MV、歌词视频、AI 分镜、图生视频与最终合成。

    蛙蛙写作 网页版
    蛙蛙写作 网页版

    蛙蛙写作 AI 创作工具,覆盖小说、剧本、文案,一键生成文稿,打通文字转视频全流程,高效解决创作难题。

    讯飞智作 网页版
    讯飞智作 网页版

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    超级简历WonderCV 网页版
    超级简历WonderCV 网页版

    超级简历WonderCV是面向应届生和AI小白的智能求职平台,覆盖简历、面试与职业规划。

    音述AI 网页版
    音述AI 网页版

    音述AI,是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区。

    AionClaw Windows版
    AionClaw Windows版

    AionClaw 是可在桌面端运行的任务型 AI 助手,通过数字专家与技能市场组合办公、创作、数据和开发能力。

    Loomy Windows版
    Loomy Windows版

    Loomy 是科大讯飞推出的桌面 AI 助手,可通过对话、任务与工作目录协助处理办公、内容创作和资料整理。

    AirServer Windows版
    AirServer Windows版

    AirServer Windows版可把电脑变成AirPlay、Google Cast和Miracast无线投屏接收端,适合会议演示、课堂教学及家庭大屏分享。发送设备通常无需另装客户端,并可同时接收和智能排列多个镜像会话。