Retrofit:使用Retrofit优雅地对接第三方接口

Posted ABin-阿斌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Retrofit:使用Retrofit优雅地对接第三方接口相关的知识,希望对你有一定的参考价值。

我是 ABin-阿斌:写一生代码,创一世佳话,筑一览芳华。 如果小伙伴们觉得我的文章不错,记得一键三连,感谢~

一、前言

  • 在实际开发当中,我们常常会对接一些第三方的接口来获取我们想要的数据。过去以往的对接技术比较繁琐,且不优雅。今天就来介绍一下如何使用:Retrofit 优雅地对接第三方接口。
  • 今天介绍的这款:Retrofit 是由 github作者: LianjiaTech 发布的一个与 SpringBoot 整合的项目,使用起来比较简单,功能丰富,代码也比较优雅。
  • 项目地址:github: https://github.com/LianjiaTech/retrofit-spring-boot-starter

二、Retrofit 的介绍

  • Retrofit 是适用于 AndroidJava 且类型安全的 HTTP 客户端,其最大的特性的是支持通过接口的方式发起 HTTP 请求。而 Spring-Boot 是使用最广泛的 Java 开发框架,但是 Retrofit 官方没有支持与 Spring-Boot 框架快速整合,因此 LianjiaTech:github 作者他们开发了 Retrofit-Spring-Boot-Starter
  • retrofit-spring-boot-starter 实现了 RetrofitSpring-Boot 框架快速整合,并且支持了诸多功能增强,极大简化开发。

三、HTTP请求相关注解

  • HTTP 请求相关注解,详细信息可参考官方文档:retrofit retrofit:官方文档,以下是一个简单的说明。
  • 请求方式:@GET @HEAD @POST @PUT @DELETE @OPTIONS @HTTP
  • 请求头:@Header @HeaderMap @Headers
  • 查询参数:@Query @QueryMap @QueryName
  • 路径参数:@Path
  • 形式编码参数:@Field @FieldMap @FormUrlEncoded
  • 请求体:@Body
  • 上传文件:@Multipart @Part @PartMap
  • 网址参数:@Url

四、具体使用

  • 这里我就直接演示 Retrofit 是如何具体使用的,详细的具体参数可参考上方 github 项目,里面有具体的介绍。

  • 由于我们这个项目会对接大量的第三方接口,所以我们都会归类起来针对一个具体的功能建一个 interface,然后去对接第三方不同的接口,最终哪里用到直接注入对应接口即可,通过Service调用具体方法嵌入到业务中。

  • 接口的基本请求 IP直接用这个自定义注解,里面用这个 baseUrl 即可

  • baseUrl 我们直接写在配置里面会好一些,这样可以正对不同环境进行变换,而不是直接写死

  • 关于上图中 @Sign 自定义注解的作用
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@InterceptMark
public @interface Sign 

    String cookie() default "";

    /**
     * 拦截器匹配路径
     *
     * @return
     */
    String[] include() default "/**";

    /**
     * 拦截器排除匹配,排除指定路径拦截
     *
     * @return
     */
    String[] exclude() default ;

    /**
     * 处理该注解的拦截器类
     * 优先从spring容器获取对应的Bean,如果获取不到,则使用反射创建一个!
     * 
     * 注意:BasePathMatchInterceptor:这个抽象方法在github项目中有具体的源码,可以直接搜索查看和使用
     * @return
     */
    Class<? extends BasePathMatchInterceptor> handler() default SignInterceptor.class;

1、添加

  • 这里对接是第三方的一个添加接口,其实就是跟我们平时在 Controller 层写接口一样的。添加的话我们就用:@POST,里面的参数就是第三的 URL,然后就是定义出参入参参数。
  • 至于如何快速地获取第三方接口接口生成实体类,可以看我这篇文章:IDEA:插件系列:GsonFormat插件的具体使用与介绍
  • 由于添加入参一般就是 JSON 数据,然后我们按照上面介绍的 HTTP 具体注解介绍来对号入座加上就可以了。这个 @Header 也是必填参数,具体可以根据对接的第三方接口参数结构来写。

2、删除

3、修改

4、查询

  • 这个查询是不带分页的

  • 带分页的

5、具体测试

  • 那么我们在接口中写好这些方法后,如何知道是否写的真确呢,那么这时我们就需要写一个测试类用Postman测试一下,确保接口能返回我们想要的数据就好。
  • 下面只是举例,具体可以根据自己的项目来编写测试类
@Slf4j
@RestController
@RequiredArgsConstructor(onConstructor = @__(@Lazy))
@RequestMapping("docking/vpn")
public class DockingVpnController 

    private final DockingVpnService dockingVpnService;

    private final UserFeign userFeign;

    @PostMapping("/add")
    public R<DockingAddVpnGatewayDto> addVpnGatewayInfo(@RequestBody @Valid AddVpnGatewayParam param) 
        //占时使用,测试需手动写入UserId
        Long userId = 0L;
        UserInfoEntity userInfoEntity = userFeign.getById(userId).getData();
        String keystoneToken = getTokenByUserId(userInfoEntity.getId(), userInfoEntity.getType());
        AddVpnGatewayParam.VpnserviceDTO vpnService = param.getVpnservice();
        DockingAddVpnGatewayDto vpnGatewayDto = dockingVpnService.addVpnGatewayInfo(param, keystoneToken);
        DockingAddVpnGatewayDto.VpnserviceDTO vpnServiceDTO = vpnGatewayDto.getVpnservice();
        vpnServiceDTO
                .setName(vpnService.getName())
                .setRouterId(vpnService.getRouterId());
        return R.success(vpnGatewayDto);

    

总结

  • 总而言之,这个整合后的框架时非常好用的,使用起来不管是新手还是老手都非常容易上手。对接起来也是十分的方便,真的十分感谢整合的原作者。
  • 各位有这个需求的小伙伴,也可以去用一下,真香警告!

以上是关于Retrofit:使用Retrofit优雅地对接第三方接口的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin协程优雅的与Retrofit缠绵

SpringBoot优雅的http客户端工具(Retrofit)

Retrofit + 协程封装,如何优雅的去掉try catch?

两种方式封装Retrofit+协程,实现优雅快速的网络请求

两种方式封装Retrofit+协程,实现优雅快速的网络请求

Android Retrofit+RxJava 优雅的处理服务器返回异常错误