如何封装第三方API

日常开发中,少不了对第三方api的封装。api封装的好坏绝定了后期维护的难度以及使用api的开发人员是否抱怨。比如:有一天第三方api的域名变了。或者自己封装的api没有参数说明,过段时间来改代码自己忘什么意思了。或者应该调用哪个URL来满足我当前的需求。考虑到这些因素,最终选择将api封装为jar包,并生成相应的文档。

首先看一个错误案例:

如何封装第三方API

错误例子

url没有使用全局变量,一旦域名变更或者http变为https,你就得满项目的替换。bug的几率可以说是飙升。大家千万别存在侥幸心理说域名和http协议是不会变的。在我封装的oppo api中就出现了http协议的变更,而360点睛api出现了域名的变更(这种事情不可以不预防)。再者上面的传参是存在问题的。个人认为应该写成javaBean,并且bean中要有注释,不然可能出现开发人员过段时间不知道字段什么意思了,或者开发者块的程序员离职了,下一个开发者的人完全不知道这写的什么。

虽然说像oppo会给你一份pdf文档,告诉你传递哪些参数。360点睛是提供的html页面。但是在开发中难道还要找文档去编码吗。多影响效率而且代码会写的很乱,一个人一个样。后期一旦出现问题,有的程序员会记录调用api的日志,但是有的人没有记录,找bug时,无论是对于管理人还是开发人都是头疼的事。所以在封装api的前期就一定得把好脉。

综上所述,我选择封装成jar包,放在svn上,谁要是使用,就下载jar包,放在自己的项目里。而且这个jar包我只让一个人管理开发,其他人只管使用jar包。这样后期出问题可以直接定位到人。

现在说下如何封装(我拿今日头条的API说下)

1、首先我要有一个全局的url定义,目的就是一旦出现域名或者协议变更,更改一处代码就OK了,如图:

如何封装第三方API

全局URL

2、封装HTTP请求,(GET、POST),并记录详细日志【我使用的HttpClient,也可以使用别的,如java自带的】

如何封装第三方API

自己封装请求

这里详细的记录,请求数据,返回数据,消耗时间。这么写后开发人员完全就不必关心日志的问题,而且一旦http改成https在这里修改一下就可以了。

3、定义实体类(javaBean)【请求bean、返回bean】,这块是最烦人的,看着返回的json,一个一个字段的写。我教个简单的。

如何封装第三方API

json示例

如图中的这个json,访问此url:http://www.bejson.com/json2javapojo/new/

如何封装第三方API

直接生成javaBean

把json放在里面会自动为我们生成bean,很方便吧。

4、对外提供方法,供别人调用(通过javadoc生成文档),如图:

如何封装第三方API

提供外部调用

这样如果别人想要获取代理商下的广告主ID列表,直接调用AccountService.getAdvertiserList(xx,xx)就可以了,不必关心内部的实现。生成的文档可以看到。

如何封装第三方API

文档1

点击进去看详细参数

如何封装第三方API

文档详细描述

在点击AccountParams看详细参数

如何封装第三方API

参数描述

到此api封装就完事了。这里说下如何将json数据转为javaBean。看到我上面代码的应该知道我使用的是Gson

最简单的实现就是:

response = (AccountClientLoginResponse) gson.fromJson(result,

AccountClientLoginResponse.class);

AccountClientLoginResponse就是你想转为的bean。

复杂些的如带泛型:

response = gson.fromJson(jsonStr,

new TypeToken

}.getType());

这2个内容,我放在下一篇文章说。喜欢的可以关注下,等待我下次更新。

总结:在一些公司调用第三方api如:oppo、vivo、头条、360,这些api不知道什么时候会更新,为了为会期的维护和开发着想,一定要对api统一管理。避免牵一发而动全身

Original: https://www.cnblogs.com/fengli9998/p/12106157.html
Author: 小虾米的java梦
Title: 如何封装第三方API

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/539388/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 自定义注解实现加解密及脱敏

    定义自定义注解 @Documented @Target({ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @Orde…

    Java 2023年6月15日
    081
  • 面向对象ooDay3

    在派生类的构造方法中若没有调用超类的构造方法,则默认super()调用超类的无参构造方法 public class SuperDemo { public static void m…

    Java 2023年6月13日
    055
  • RabbitMQ

    RabbitMQ 回顾Docker Docker: 容器化技术 作用: 可以实现软件环境的快速迁移与恢复 docker原理: 先将软件依赖的一切打成镜像 运行镜像成容器,从而恢复软…

    Java 2023年6月13日
    072
  • Spring Security Oauth2 单点登录案例实现和执行流程剖析

    在线演示 演示地址:http://139.196.87.48:9002/kitty 用户名:admin 密码:admin Spring Security Oauth2 OAuth是…

    Java 2023年5月30日
    073
  • MySQL基础(2)

    MySQL服务器支持SQL,因此,如何通过SQL告知MySQL服务器如何完成各种数据管理操作,就是重中之重。要想和服务器做好交流,则必须熟练掌握它。当使用某个程序(如mysql客户…

    Java 2023年6月5日
    085
  • Spring-Boot项目中配置redis注解缓存

    在pom中添加redis缓存支持依赖 org.springframework.boot spring-boot-starter-data-redis 在yml中添加redis配置 …

    Java 2023年6月8日
    080
  • RabbitMQ-工作模式

    RabbitMQ演示代码+Spring/SpringBoot整合RabbitMQ ✨ (GitHub仓库链接)[https://github.com/2537422279/Rabb…

    Java 2023年6月5日
    079
  • redis 注册开机自启动服务(注意:要到你安装redis的根目录下执行下面的cmd命令)

    #注册安装服务 redis-server –service-install redis.windows.conf –loglevel verbose #卸载服务 #redis-…

    Java 2023年6月5日
    098
  • 打破双亲委派机制的自定义类加载器

    1.场景 mybatis的插件去做切换数据源 数据源存放在map中 mybatis的插件去map拿数据,发现数据丢失 2.springboot为了热加载自定义的 RestartCl…

    Java 2023年6月13日
    062
  • 高性能Java RPC框架Dubbo

    摘自《Java微服务分布式架构企业实战》 讲解了使用Spring Cloud来解决微服务应用程序开发过程中所遇到的一系列诸如客户端如何调用服务、服务与服务之间如何进行通信、服务如何…

    Java 2023年5月29日
    072
  • OpenJDK 发行版本(国内和国外)

    发行版本 OpenJDK 发行版 公司 主页 亚马逊 腾讯 阿里 微软 华为 Zulu JDK Azul The Eclipse Temurin eclipse Amazon Co…

    Java 2023年6月9日
    084
  • Nginx作为缓存服务

    一、缓存类型 1、服务端缓存 2、代理缓存 3、客户端缓存 4、代理缓存的工作流程: 二、代理缓存配置语法 1、代理缓存路径 配置语法 Syntax: proxy_cache_pa…

    Java 2023年5月30日
    088
  • SpringBoot集成thymeleaf模板

    1.在pom文件添加: org.springframework.boot spring-boot-starter-thymeleaf2.在html页面的头部添加 3.在java C…

    Java 2023年6月14日
    067
  • 分布式基础-分布式事务

    没有数据库前,数据如果是文件方式存储在磁盘中,那么如果写入的过程中,可能写入过程中出差;或者因为我们程序挂掉原因,导致数据可能写了一半,如果多个应用程序同时在写程序的话,那问题就更…

    Java 2023年5月30日
    0103
  • 网络编程

    网络编程 计算机网络是指将 地理位置不同的具有独立功能的 多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及 网络通信协议的管理和协调下, 实现资源共享和…

    Java 2023年6月6日
    099
  • Netty源码研究笔记(1)——开篇

    1.1. Netty介绍 Netty是一个老牌的高性能网络框架。在众多开源框架中都有它的身影,比如:grpc、dubbo、seata等。 里面有着非常多值得学的东西: I/O模型 …

    Java 2023年6月10日
    071
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球