Heim > Java > javaLernprogramm > So verwenden Sie das HTTP-Client-Tool Retrofit in SpringBoot

So verwenden Sie das HTTP-Client-Tool Retrofit in SpringBoot

王林
Freigeben: 2023-05-12 11:55:20
nach vorne
1011 Leute haben es durchsucht

Einführung

Retrofit ist ein typsicheres HTTP-Client-Tool, das für Android und Java geeignet ist. Es ist bereits auf Github 39k+Stern. Sein größtes Merkmal ist, dass es das Initiieren von HTTP-Anfragen über die Schnittstelle unterstützt, ähnlich wie wir Feign zum Aufrufen der Microservice-Schnittstelle verwenden. AndroidJava且类型安全的HTTP客户端工具,在Github上已经有39k+Star。其最大的特性的是支持通过接口的方式发起HTTP请求,类似于我们用Feign调用微服务接口的那种方式。

So verwenden Sie das HTTP-Client-Tool Retrofit in SpringBoot

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

So verwenden Sie das HTTP-Client-Tool Retrofit in SpringBoot

使用

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

依赖集成

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

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

基本使用

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

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

So verwenden Sie das HTTP-Client-Tool Retrofit in SpringBoot

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

remote:
  baseUrl: http://localhost:8088/
Nach dem Login kopieren

再通过@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<LoginInfo> login(@Field("username") String username, @Field("password") String password);
}
Nach dem Login kopieren

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

So verwenden Sie das HTTP-Client-Tool Retrofit in SpringBoot

接下来在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<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;
    }
}
Nach dem Login kopieren

为方便后续调用需要登录认证的接口,我创建了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;
    }
}
Nach dem Login kopieren

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

So verwenden Sie das HTTP-Client-Tool Retrofit in SpringBoot

注解式拦截器

商品品牌管理接口,需要添加登录认证头才可以正常访问,我们可以使用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);
    }
}
Nach dem Login kopieren

创建调用品牌管理接口的客户端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<CommonPage<PmsBrand>> list(@Query("pageNum") Integer pageNum, @Query("pageSize") Integer pageSize);
    @GET("brand/{id}")
    CommonResult<PmsBrand> 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);
}
Nach dem Login kopieren

再在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<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);
    }
}
Nach dem Login kopieren

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

So verwenden Sie das HTTP-Client-Tool Retrofit in SpringBoot

全局拦截器

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

创建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);
    }
}
Nach dem Login kopieren

配置

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

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

So verwenden Sie das HTTP-Client-Tool Retrofit in SpringBoot

我们可以将application.yml中的retrofit.global-log-strategy属性修改为body

So verwenden Sie das HTTP-Client-Tool Retrofit in SpringBoot

SpringBoot ist das am weitesten verbreitete Java-Entwicklungsframework, Retrofit bietet jedoch offiziell keinen dedizierten Starter an. Also entwickelte ein alter Mann retrofit-spring-boot-starter, der die schnelle Integration des Retrofit- und SpringBoot-Frameworks realisierte und viele funktionale Verbesserungen unterstützte, was die Entwicklung erheblich vereinfachte. Heute werden wir diesen Drittanbieter-Starter verwenden, um Retrofit zu betreiben.

So verwenden Sie das HTTP-Client-Tool Retrofit in SpringBootSo verwenden Sie das HTTP-Client-Tool Retrofit in SpringBoot

Mit

    Es ist sehr einfach, Retrofit in SpringBoot zu verwenden. Lassen Sie es uns unten erleben.
  • Abhängigkeitsintegration

  • Mit der Unterstützung von Starter eines Drittanbieters dauert die Integration von Retrofit nur einen Schritt, fügen Sie einfach die folgenden Abhängigkeiten hinzu.
  • retrofit:
      # 日志打印配置
      log:
        # 启用日志打印
        enable: true
        # 日志打印拦截器
        logging-interceptor: com.github.lianjiatech.retrofit.spring.boot.interceptor.DefaultLoggingInterceptor
        # 全局日志打印级别
        global-log-level: info
        # 全局日志打印策略
        global-log-strategy: body
    Nach dem Login kopieren

    Grundlegende Verwendung

    Nehmen wir die Schnittstelle in mall-tiny-swagger als Beispiel, um die grundlegende Verwendung von Retrofit zu erleben.

    #🎜🎜#Zunächst bereiten wir einen Dienst vor, um Remote-Anrufe zu ermöglichen. Wir verwenden die vorherige mall-tiny-swagger-Demo und werfen einen Blick darauf Schnittstelle und Anforderungen. Melden Sie sich bei der CRUD-Schnittstelle der zertifizierten Produktmarke an, #🎜🎜##🎜🎜#SpringBoot中So verwenden Sie das HTTP-Client-Tool Retrofit#🎜🎜##🎜🎜# Versuchen wir zunächst, die Anmeldeschnittstelle aufzurufen und mall-tiny-swagger in <code>application.yml zu konfigurieren s Serviceadresse; #🎜🎜#
    retrofit:
      # 全局连接超时时间
      global-connect-timeout-ms: 3000
      # 全局读取超时时间
      global-read-timeout-ms: 3000
      # 全局写入超时时间
      global-write-timeout-ms: 35000
      # 全局完整调用超时时间
      global-call-timeout-ms: 0
    Nach dem Login kopieren
    Nach dem Login kopieren
    #🎜🎜# Dann deklarieren Sie einen Retrofit-Client über @RetrofitClient. Da die Anmeldeschnittstelle über das POST-Formular aufgerufen wird, < Hier werden die Anmerkungen >@POST und @FormUrlEncoded verwendet Weitere Informationen finden Sie in der offiziellen Retrofit-Dokumentation /014/168386372321669.png" alt="SpringBoot So verwenden Sie das HTTP-Client-Tool Retrofit" />#🎜🎜##🎜🎜# Als nächstes fügen Sie UmsAdminApi in den Controller ein und rufen ihn dann auf; # 🎜🎜#
    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
    Nach dem Login kopieren
    Nach dem Login kopieren
    #🎜🎜# ist Um nachfolgende Aufrufe von Schnittstellen zu erleichtern, die eine Anmeldeauthentifizierung erfordern, habe ich die Klasse TokenHolder erstellt und das Token in der Sitzung gespeichert , testen Sie über Swagger und rufen Sie die Schnittstelle auf, die vom Remote-Dienst zurückgegeben wurde. Zugriffsadresse: http://localhost:8086/swagger-ui/#🎜🎜##🎜🎜#So verwenden Sie das HTTP-Client-Tool Retrofit in SpringBoot#🎜🎜#

    Annotation interceptor

    # 🎜🎜#Produktmarkenverwaltungsschnittstelle. Für den normalen Zugriff müssen Sie einen Login-Authentifizierungsheader hinzufügen. Dazu können wir den Annotation Interceptor in Retrofit verwenden. #🎜🎜##🎜🎜#Erstellen Sie zunächst einen Annotations-Interceptor TokenInterceptor erbt BasePathMatchInterceptor und fügen Sie dann doIntercept hinzu >Authorization-Header; #🎜🎜#rrreee#🎜🎜#Erstellen Sie einen Client PmsBrandApi, der die Markenverwaltungsschnittstelle aufruft, und verwenden Sie die Annotation @Intercept zum Konfigurieren der Interceptor und Interception Path; #🎜🎜#rrreee#🎜🎜# Dann fügen Sie die PmsBrandApi-Instanz in den Controller ein und fügen Sie eine Methode zum Aufrufen des Remote-Dienstes hinzu; Die Schnittstelle in Swagger wurde getestet und festgestellt, dass sie erfolgreich aufgerufen werden kann. #🎜🎜##🎜🎜#So verwenden Sie das HTTP-Client-Tool Retrofit in SpringBoot #🎜🎜#

    Globaler Interceptor

    #🎜🎜#Wenn Sie allen Anfragen einen Request-Header hinzufügen möchten, können Sie den globalen Interceptor verwenden. #🎜🎜##🎜🎜#Erstellen Sie die Klasse SourceInterceptor, um die Schnittstelle BaseGlobalInterceptor zu erben, und fügen Sie dann den Anforderungsheader source im Header hinzu. #🎜🎜#rrreee

    Konfiguration

    #🎜🎜#Retrofit hat viele Konfigurationen Im Folgenden werden wir über die drei am häufigsten verwendeten Konfigurationen sprechen: Protokolldruck, globales Timeout und globale Anforderungswiederholung. #🎜🎜#
    #🎜🎜#Protokolldruck In der Standardkonfiguration verwendet Retrofit die grundlegende Protokollstrategie und die gedruckten Protokolle sind sehr einfach; img src="https ://img.php.cn/upload/article/000/465/014/168386372413173.png" alt="So verwenden Sie das HTTP-Client-Tool Retrofit in SpringBoot" />#🎜🎜##🎜 🎜#Wir können < Die retrofit.global-log-strategy-Eigenschaft in code>application.yml wird in body geändert, um das vollständigste Protokoll zu drucken; #🎜🎜#rrreee#🎜🎜 #Nach der Änderung der Protokolldruckstrategie sind die Protokollinformationen umfassender; #🎜🎜##🎜🎜## 🎜🎜##🎜🎜#KEINE: Protokolle nicht drucken; #🎜🎜##🎜🎜##🎜🎜##🎜🎜#BASIC: Nur Protokollanforderungsdatensätze drucken; #🎜🎜 #
  • HEADERS:打印日志请求记录、请求和响应头信息;

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

全局超时时间

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

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

全局请求重试

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
Nach dem Login kopieren
Nach dem Login kopieren

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

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

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

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

Das obige ist der detaillierte Inhalt vonSo verwenden Sie das HTTP-Client-Tool Retrofit in SpringBoot. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:yisu.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage