如何封装第三方API

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

首先看一个错误案例:

错误例子

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了,如图:

全局URL

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

自己封装请求

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

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

json示例

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

直接生成javaBean

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

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

提供外部调用

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

文档1

点击进去看详细参数

文档详细描述

在点击AccountParams看详细参数

参数描述

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

最简单的实现就是:

response = (AccountClientLoginResponse) gson.fromJson(result,

AccountClientLoginResponse.class);

AccountClientLoginResponse就是你想转为的bean。

复杂些的如带泛型:

response = gson.fromJson(jsonStr,

new TypeToken<BasicsResponse<ConvertInfo>>() {

}.getType());

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

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

原文地址:https://www.cnblogs.com/fengli9998/p/12106157.html

时间: 2024-10-08 04:09:22

如何封装第三方API的相关文章

如何更优雅地对接第三方API

本文所有示例完整代码地址:https://github.com/yu-linfeng/BlogRepositories/tree/master/repositories/third 我们在日常开发过程中,有不少场景会对接第三方的API,例如第三方账号登录,第三方服务等等.第三方服务会提供API或者SDK,我依稀记得早些年Maven还没那么广泛使用,通常要对接第三方服务的时候会去下载第三方服务的SDK开发包,也就是jar包,拷贝到自己的工程中进行开发.但现如今,几乎所有的大中小企业都使用Maven

ZooKeeper客户端原生API的使用以及ZkClient第三方API的使用

这两部分内容的介绍主要讲的是节点及节点内容和子节点的操作,并且讲解的节点的事件监听以及ACL授权 ZooKeeper客户端原生API的使用 百度网盘地址: http://pan.baidu.com/s/1jI3b8n8 ZkClient第三方API的使用 ZkClient是Github上一个开源的ZooKeeper客户端.ZkClient在ZooKeeper原生API之上进行了包装,是一个更加易用的ZooKeeper客户端.同时ZkClient在内部实现了诸如Session超时重连.Watche

在线旅游平台如何借监控宝确保第三方API高可用

十几年前,有一首流行歌曲<我想去桂林>红遍华夏大地,那时候旅游对很多人来说是一种奢侈.然而经济和社会福利的飞速发展,有钱有闲的国人越来越多,一到各种假期,不但国内旅游景点人满为患,就连周边国家和地区也满是中国游客,旅游已经成为大部分中国人日常生活中不可或缺的一部分.据国家旅游局发布的<2014年中国旅游业统计公报>显示,当年国内旅游人数达36.11亿人次,出境游人数达到1.07亿人次,全年实现旅游业总收入3.73万亿人民币. 随着互联网的普及和移动互联网的蓬勃兴起,在线旅游(OTA

模仿MFC封装Windows API

.... 最后添加了两个按钮,分别处理每个按钮的单击事件时,走了弯路,本来想的是在QButton中重写OnLButtonDown方法,但是,无法区分是那个按钮.参考这篇文章: http://zhidao.baidu.com/link?url=hsXHcC9q_tfdf4Ztz_juQR4fxY63UU7Ujsj1Tz1rDPKi2xk8JlnzqX4rfCPNyh-SRK-zeIFgECm9H4PuMn4GoK 在按钮的父窗体的WindowProc中处理WM_COMMAND消息,消息的LOWOR

zookeeper客户端使用第三方(zkclient)封装的Api操作节点

1.引入依赖 <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.10</version> </dependency> 2.会话连接 1 package com.karat.cn.zookeeper.zkclient; 2 3 import org.I0Itec.zkclient.ZkCl

封装第三方支付(支付宝、银联、微信支付)

今天对第三方支付做了一个小小的封装,框架的导入与配置这里就不多说了,可以去看集成文档.直接上封装的demo 使用方式:[[SKAliPayTool sharedSKAliPayTool] goPayByPayType:payName                                          andOrderNum:self.orderNumber                                             andTitle:self.order

多级分销对接第三方API获取数据系统的优化

最近在做一个基于有赞的多级分销管理系统,所有成员的店面均在有赞商城,使用有赞API获得他们的业绩,但是有赞提供的分销只有一级,故制作该系统.考虑到减轻工作量,理清层次关系,采用了OOP设计方法,将数据库,表封装为基类,分销成员,店面等继承表. 但是在列出销售量报表和分销商的时候出现了严重性能问题,由于分销商的业绩奖励是与其下级分销商挂钩的,故封装数据库的时候,进行了DFS遍历来获得所有分销商的关系树,然而,在列出销售报表的时候却并不需要这样的关系,DFS在php语言上的时间花销极大,导致一个页面

免费第三方API平台整合

各大平台免费接口,非常适用 http://developer.51cto.com/art/201412/458778.htm 绝对干货:供个人开发者赚钱免费使用的一些好的API接口http://www.360doc.com/content/15/1021/01/13370135_507200816.shtml 易源数据(大部分免费) 实用 https://www.showapi.com/api/lookPoint/9 违章数据查询 http://www.loopon.cn/ 路帮网(免费来源)

封装第三方jquery插件

需要自己编写 directives 的情况通常是当你使用了第三方的 jQuery 插件.因为插件在 AngularJS 之外对表单值进行更改,并不能即时反应到 Model 中.例如我们用得比较多的 jQueryUI datepicker 插件,当你选中一个日期后,插件会将日期字符串填到 input 输入框中.View 改变了,却并没有更新 Model,因为$('.datepicker').datepicker(); 这段代码不属于 AngularJS 的管理范围.我们需要编写一个directiv