返回顶部
首页 > 资讯 > 精选 >SpringBoot中如何使用HTTP客户端工具Retrofit
  • 872
分享到

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

2023-07-02 09:07:36 872人浏览 薄情痞子
摘要

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

今天小编给大家分享一下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支持四种日志打印策略;

  • 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:发生任意异常时执行重试。

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

--结束END--

本文标题: SpringBoot中如何使用HTTP客户端工具Retrofit

本文链接: https://lsjlt.com/news/340914.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • SpringBoot中如何使用HTTP客户端工具Retrofit
    今天小编给大家分享一下SpringBoot中如何使用HTTP客户端工具Retrofit的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解...
    99+
    2023-07-02
  • SpringBoot中使用HTTP客户端工具Retrofit
    前言 我们平时开发项目时,就算是单体应用,也免不了要调用一下其他服务提供的接口。此时就会用到HTTP客户端工具,之前一直使用的是Hutool中的HttpUtil,虽然容易上手,但用起...
    99+
    2024-04-02
  • Mac下SVN客户端工具Cornerstone使用怎么用
    Cornerstone是一款Mac下的SVN客户端工具,以下是Cornerstone的基本使用方法: 下载并安装Cornerst...
    99+
    2023-10-24
    Mac Cornerstone
  • MongoDB客户端工具NoSQL Manager for MongoDB怎么使用
    这篇文章主要讲解了“MongoDB客户端工具NoSQL Manager for MongoDB怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MongoD...
    99+
    2023-07-02
  • linux 中如何使用svn客户端
    今天就跟大家聊聊有关linux 中如何使用svn客户端,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1、将文件checkout到本地目录 svncheckoutpath(path是服...
    99+
    2023-06-13
  • SpringBoot和redis中怎么使用Lettuce客户端
    这篇文章给大家介绍SpringBoot和redis中怎么使用Lettuce客户端,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。重写连接工厂实例,更改其LettuceClientConfiguration 为开启拓扑更新...
    99+
    2023-06-20
  • 常用的MySQL客户端工具有哪些
    这篇文章主要介绍“常用的MySQL客户端工具有哪些”,在日常操作中,相信很多人在常用的MySQL客户端工具有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”常用的MySQL...
    99+
    2024-04-02
  • Docker客户端管理工具docui怎么用
    这篇文章给大家分享的是有关Docker客户端管理工具docui怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。docui终端 Docker 管理工具,自带一个终端界面。使用该工具可以方便的通过界面管理 doc...
    99+
    2023-06-16
  • Docker中如何像HTTP客户端一样连接并使用UNIX socket
    这篇文章将为大家详细讲解有关Docker中如何像HTTP客户端一样连接并使用UNIX socket,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Docker构架:薄CLI...
    99+
    2024-04-02
  • Git工具客户端Sublime Merge Mac有什么用
    这篇文章将为大家详细讲解有关Git工具客户端Sublime Merge Mac有什么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Sublime Merge for Mac是由Sublime Text知...
    99+
    2023-06-06
  • SpringBoot项目如何使用hutool工具进行http接口调用
    本文小编为大家详细介绍“SpringBoot项目如何使用hutool工具进行http接口调用”,内容详细,步骤清晰,细节处理妥当,希望这篇“SpringBoot项目如何使用hutool工具进行http接口调用”文章能帮助大家解决疑惑,下面跟...
    99+
    2023-06-30
  • 如何在Springboot中使用RedisUtils工具类
    如何在Springboot中使用RedisUtils工具类?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。SpringBoot整合Redis引入Redis依赖 &l...
    99+
    2023-06-15
  • Java的MD5工具类和客户端测试类怎么使用
    这篇文章主要讲解了“Java的MD5工具类和客户端测试类怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java的MD5工具类和客户端测试类怎么使用”吧!什么是MD5?Message ...
    99+
    2023-06-22
  • 如何使用golang中的net/http/httputil.NewProxyClient函数实现自定义的HTTP代理客户端
    如何使用golang中的net/http/httputil.NewProxyClient函数实现自定义的HTTP代理客户端在网络请求中,我们有时需要通过代理服务器来发送和接收HTTP请求。Go语言提供了一个方便的函数httputil.New...
    99+
    2023-11-18
    Golang net/http httputilNewProxyClient
  • 如何理解构建客户端应用的开源工具集Oracle JET
    如何理解构建客户端应用的开源工具集Oracle JET,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Oracle  JavaSc...
    99+
    2024-04-02
  • web开发中如何使用客户端脚本
    这篇文章给大家分享的是有关web开发中如何使用客户端脚本的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 客户端脚本是指由用户的Web浏览器执行的计算机程序的类型。JavaScr...
    99+
    2024-04-02
  • 如何使用io阅读器客户端
    积累知识,胜过积蓄金银!毕竟在Golang开发的过程中,会遇到各种各样的问题,往往都是一些细节知识点还没有掌握好而导致的,因此基础知识点的积累是很重要的。下面本文《如何使用io阅读器客户端》,就带大...
    99+
    2024-04-04
  • OPC UA服务端(Prosys OPC UA Simulation Server)和客户端(OPC UA Explorer)工具使用
    OPC UA服务端(Prosys OPC UA Simulation Server) Prosys OPC UA Simulation Server下载地址 https://downloads.pro...
    99+
    2023-08-31
    经验分享
  • 如何利用Go语言打造高效的HTTP客户端?
    在现代的Web应用程序中,HTTP客户端是一个不可或缺的组件。不论是向第三方API发送请求,还是在应用程序内部调用其他服务,我们都需要一个可靠、高效的HTTP客户端。本文将介绍如何使用Go语言编写一个高效的HTTP客户端。 一、Go语言中...
    99+
    2023-11-09
    http numpy unix
  • 如何在PHP中使用HTTP负载测试工具?
    PHP是一种广泛使用的编程语言,因此,了解如何使用HTTP负载测试工具对PHP应用程序进行测试非常重要。HTTP负载测试工具可以帮助我们在不同的条件下模拟用户对应用程序的访问,以便我们了解我们的应用程序在不同的负载下的表现如何。在本文中,我...
    99+
    2023-10-01
    http load shell
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作