我调用第三方接口遇到的13大坑

article/2025/6/8 17:44:28

关注

脚本之家

,与百万开发者在一起

来源 | 苏三说技术 (ID:susanSayJava)

已获得原公众号的授权转载

前言

在实际工作中,我们经常需要在项目中调用第三方API接口,获取数据,或者上报数据,进行数据交换和通信。

那么,调用第三方API接口会遇到哪些问题?如何解决这些问题呢?

这篇文章就跟大家一起聊聊第三方API接口的话题,希望对你会有所帮助。

1 域名访问不到

一般我们在第一次对接第三方平台的API接口时,可能会先通过浏览器或者postman调用一下,该接口是否可以访问。

有些人可能觉得多次一举。

其实不然。

有可能你调用第三方平台的API接口时,他们的接口真的挂了,他们还不知道。

还有一种最重要的情况,就是你的工作网络,是否可以访问这个外网的接口。

有些公司为了安全考虑,对内网的开发环境,是设置了防火墙的,或者有一些其他的限制,有些ip白名单,只能访问一些指定的外网接口。

如果你发现你访问的域名,在开发环境访问不通,就要到运维同学给你添加 ip白名单 了。

2 签名错误

很多第三方API接口为了防止别人篡改数据,通常会增加数字签名(sign)的验证。

sign = md5(多个参数拼接 + 密钥)

在刚开始对接第三方平台接口时,会遇到参数错误,签名错误等问题。

其中参数错误比较好解决,重点是签名错误这个问题。

签名是由一些算法生成的。

比如:将参数名和参数值用冒号拼接,如果有多个参数,则按首字母排序,然后再将多个参数一起拼接。然后加盐(即:密钥),再通过md5,生成一个签名。

如果有多个参数,你是按首字母倒序的,则最后生成的签名会出问题。

如果你开发环境的密钥,用的生产环境的,也可能会导致生产的签名出现问题。

如果第三方平台要求最后3次md5生成签名,而你只用了1次,也可能会导致生产的签名出现问题。

因此,接口签名在接口联调时是比较麻烦的事情。

如果第三方平台有提供sdk生成签名是最好的,如果没有,就只能根据他们文档手写签名算法了。

3 签名过期

通过上面一步,我们将签名调通了,可以正常访问第三方平台获取数据了。

但你可能会发现,同一个请求,15分钟之后,再获取数据,却返回失败了。

第三方平台在设计接口时,在签名中增加了时间戳校验,同一个请求在15分钟之内,允许返回数据。如果超过了15分钟,则直接返回失败。

这种设计是为了安全考虑。

防止有人利用工具进行暴力破解,不停伪造签名,不停调用接口校验,如果一直穷举下去的话,总有一天可以校验通过的。

sign = md5(多个参数拼接 + 密钥 + 时间戳)

因此,有必要增加时间戳的校验。

如果出现这种情况,不要慌,重新发起一次新的请求即可。

4 接口突然没返回数据

如果你调用第三方平台的某个API接口查询数据,刚开始一直都有数据返回。

但突然某一天没返回数据了。

但是该API接口能够正常响应。

不要感到意外,有可能是第三方平台将数据删除了。

我对接完第三方平台的API接口后,部署到了测试环境,发现他们接口竟然没有返回数据,原因是他们有一天将测试环境的数据删完了。

因此,在部署测试环境之前,要先跟对方沟通,要用哪些数据测试,不能删除。

5 token失效

有些平台的API接口在请求之前,先要调用另外一个API接口获取token,然后再header中携带该token信息才能访问其他的业务API接口。

在获取token的API接口中,我们需要传入账号、密码和密钥等信息。每个接口对接方,这些信息都不一样。

我们在请求其他的API接口之前,每次都实时调用一次获取token的接口获取token?还是请求一次token,将其缓存到redis中,后面直接从redis获取数据呢?

很显然我们更倾向于后者,因为如果每次请求其他的API接口之前,都实时调用一次获取token的接口获取token,这样每次都会请求两次接口,性能上会有一些影响。

如果将请求的token,保存到redis,又会出现另外一个问题: token失效 的问题。

我们调用第三方平台获取token的接口获取到的token,一般都有个有效期,比如:1天,1个月等。

在有效期内,该API接口能够正常访问。如果超过了token的有效期,则该API接口不允许访问。

好办,我们把redis的失效时间设置成跟token的有效期一样不就OK了?

想法是不错,但是有问题。

你咋保证,你们系统的服务器时间,跟第三方平台的服务器时间一模一样?

我之前遇到过某大厂,提供了获取token接口,在30天内发起请求,每次都返回相同的token值。如果超过了30天,则返回一个新的。

有可能出现这种情况,你们系统的服务器时间要快一些,第三方平台的时间要慢一些。结果到了30天,你们系统调用第三方平台的获取token接口获取到了token还是老的token,更新到redis中了。

过一段时间,token失效了,你们系统还是用老的token访问第三方平台的其他API接口,一直都返回失败。但获取新的token却要等30天,这个时间太漫长了。

为了解决这个问题,需要捕获token失效的异常。如果在调用其他的API接口是发现token失效了,马上请求一次获取token接口,将新的token立刻更新到redis中。

这样基本可以解决token失效问题,也能尽可能保证访问其他接口的稳定性和性能。

6 接口超时

系统上线之后,调用第三方API接口,最容易出现的问题,应该是 接口超时 问题了。

系统到外部系统之间,有一条很复杂的链路,中间有很多环节出现问题,都可能影响API接口的相应时间。

作为API接口的调用方,面对第三方API接口超时问题,除了给他们反馈问题,优化接口性能之外,我们更有效的方式,可能是增加接口调用的 失败重试机制 。

例如:

intretryCount= 0;

do{

try{

doPost;

break;

} catch(Exception e) {

log.warn( "接口调用失败")

retryCount++;

}

} where (retryCount <= 3)

如果接口调用失败,则程序会立刻自动重试 3次 。

如果重试之后成功了,则该API接口调用 成功 。

如果重试3次之后还是失败,则该API接口调用 失败 。

7 接口返回500

调用第三方API接口,偶尔因为参数的不同,可能会出现500的问题。

比如:有些API接口对于参数校验不到位,少部分必填字段,没有校验不能为空。

刚好系统的有些请求,通过某个参数去调用该API接口时,没有传入那个参数,对方可能会出现NPE问题。而该接口的返回code,很可能是500。

还有一种情况,就是该API接口的内部bug,传入不同的参数,走了不同的条件分支逻辑,在走某个分支时,接口逻辑出现异常,可能会导致接口返回500。

这种情况做接口重试也没用,只能联系第三方API接口提供者,反馈相关问题,让他们排查具体原因。

他们可能会通过修复bug,或者修复数据,来解决这个问题。

8 接口返回404

如果你在系统日志中发现调用的第三方API接口返回了404,这就非常坑了。

如果第三方的API接口没有上线,很可能是他们把接口名改了,没有及时通知你。

这种情况,可以锤他们了。

还有一种情况是,如果第三方的API接口已经上线了,刚开始接口是能正常调用的。

第三方也没有改过接口地址。

后来,突然有一天发现调用第三方的API接口还是出现了404问题。

这种情况很可能是他们网关出问题了,最新的配置没有生效,或者改了网关配置导致的问题。

总之一个字:坑。

9 接口返回少数据了

之前我调过一个第三方的API接口分页查询数据,接入非常顺利,但后来上线之后,发现他们的接口少数据了。

一查原因发现是该分页查询接口,返回的 总页数 不对,比实际情况少了。

有些小伙伴可能会好奇,这么诡异的问题我是怎么发现?

之前调用第三方API接口分页查询分类数据,保存到我们的第三方分类表中。

突然有一天,产品反馈说,第三方有个分类在分类树中找不到。

我确认之后,发现竟然是真的没有。

从调用第三方API接口的响应日志中,也没有查到该分类的数据。

这个API接口是分页查询接口,目前已经分了十几页查询数据,但还是没有查到我们想要的分类。

之前的做法是先调用一次API接口查询 第一页 的数据,同时查出 总页数 。然后再根据总页数循环调用,查询 其他页 的数据。

我当时猜测,可能是他们接口返回的总页数有问题。

于是,可以将接口调用逻辑改成这样的:

  • 从第一页开始,后面每调用一次API接口查数据,页数就加1。然后判断接口返回的数据是否小于pageSize,

  • 如果不小于,则进行下一次调用。

  • 如果小于,则说明已经是最后一页了,可以停止后续调用了。

从第一页开始,后面每调用一次API接口查数据,页数就加1。然后判断接口返回的数据是否小于pageSize,

如果不小于,则进行下一次调用。

如果小于,则说明已经是最后一页了,可以停止后续调用了。

验证之后发现这样果然可以获取那个分类的数据,只能说明第三方的分页查询接口返回的总页数比实际情况小了。

10 偷偷改参数了

我之前调用过某平台的API接口获取指标的状态,之前根据双方约定的状态有: 正常 和 禁用 两种。

然后将状态更新到我们的指标表中。

后来,双方系统上线运行了好几个月。

突然有一天,用户反馈说某一条数据明明删除了,为什么在页面上还是可以查到。

此时,我查我们这边的指标表,发现状态是正常的。

然后查看调用该平台的API接口日志,发现返回的该指标的状态是: 下架 。

what?

这是什么状态?

跟该平台的开发人员沟通后,发现他们改了状态的枚举,增加了:上架、下架等多个值,而且没有通知我们。

这就坑了。

我们这边的代码中判断,如果状态非禁用状态,都认为是正常状态。

而下架状态,自动被判断为正常状态。

经过跟对方沟通后,他们确认下架状态,是非正常状态,不应该显示指标。他们改了数据,临时解决了该指标的问题。

后来,他们按接口文档又改回了之前的状态枚举值。

11 接口时好时坏

不知道你在调用第三方接口时,有没有遇到过接口时好时坏的情况。

5分钟前,该接口还能正常返回数据。

5分钟后,该接口返回503不可用。

又过了几分钟,该接口又能正常返回数据了。

这种情况大概率是第三方平台在重启服务,在重启的过程中,可能会出现服务暂时不可用的情况。

还有另外一种情况:第三方接口部署了多个服务节点,有一部分服务节点挂了。也会导致请求第三方接口时,返回值时好时坏的情况。

此外还有一种情况:网关的配置没有及时更新,没有把已经下线的服务剔除掉。

这样用户请求经过网关时,网关转发到了已经下线的服务,导致服务不可用。网关转发请求到正常的服务,该服务能够正常返回。

如果遇到该问题,要尽快将问题反馈给第三方平台,然后增加接口失败重试机制。

12 文档和接口逻辑不一致

之前还遇到一个第三方平台提供的API查询接口,接口文档中明确写明了有个 dr 字段表示 删除状态 。

有了这个字段,我们在同步第三方平台的分类数据时,就能够知道有哪些数据是被删除的,后面可以及时调整我们这边的数据,将相关的数据也做删除处理。

后来发现有些分类,他们那边已经删除了,但是我们这边却没删除。

这是啥情况呢?

代码逻辑很简单,我review了一下代码,也没有bug,为什么会出现这种情况呢?

追查日志之后发现,调用第三方平台获取分类接口时,对方并没有把已删除的分类数据返回给我们。

也就是说接口文档中的那个dr字段没有什么用,接口文档和接口逻辑不一致。

这个问题估计好多小伙伴都遇到过。

如果要解决这个问题,主要的方案有两种:

  1. 第三方平台按文档修改接口逻辑,返回删除状态。

  2. 我们系统在调用分类查询接口之后,根据分类code判断,如果数据库中有些分类的code不在接口返回值中,则删除这些分类。

第三方平台按文档修改接口逻辑,返回删除状态。

我们系统在调用分类查询接口之后,根据分类code判断,如果数据库中有些分类的code不在接口返回值中,则删除这些分类。

之前是另外一个同事对接的接口,后来他离职了。

我查询了相关服务的日志,没有发现异常,这就奇怪了。

打开代码仔细看了一下,发现那位同事的代码中调用第三方的API接口,接收响应数据时,直接转换成了对象,没有打印当时返回的字符串。

莫非,接口返回值有问题?

后来,我增加了日志,打印出了该接口真正的返回内容值。

原因一下查到了,原来是欠费了。

如果出现该了异常,百度的API接口返回的数据结构,用之前那位同事的实体有些参数没法获取到。

这是一个不小的坑。

我们在接收第三方API接口返回数据时,尽可能先用字符串接收返回值,然后将字符串转换成相应实体类,一定要将该返回值在日志中打印出来,方便后面定位问题。

不要直接用实体对象接收返回值,有些API接口,如果出现不同的异常,返回的数据结构差异比较大。

有些异常结果可能是他们网关系统直接返回的,有些异常是他们业务系统返回的。

其实,我们之前还遇到过其他坑,比如:调用分类树查询接口,但第三方返回的数据有重复的id,我们这边该如何处理这种异常数据呢?

我们在job中循环调用第三方API接口获取数据,如果其中某一次调用失败了,是try/catch捕获异常呢?继续执行后面的调用,还是直接终止当前的程序? 如果try/catch如何保证数据一致性?终止当前程序,该如何处理后续的流程?

<END>

程序员专属T恤

商品直购链接👇

这是一件程序员才懂的T恤

聊聊接口性能优化的11个小技巧

这么写接口,同事都爱跟你合作!

编译器大佬Chris Lattner全新编程语言「Mojo」:兼容Python核心功能,提速35000倍

30年老代码被干掉!微软用18万行 Rust 改写 Windows 系统内核

Office 2019/2021专业增强版,正版终身授权!


http://www.hkcw.cn/article/LVfPLbvQKq.shtml

相关文章

有眼光的人就是不一样,恶臭的粪便也能提炼出让人上瘾的“黄金”

有时候一个人的眼光就决定了他的一切,一位商人发明了一种饮料,因制作方法独特及产出比例很低,其一公斤的价格高达1100美元左右,堪比黄金。这种饮料就是象屎咖啡,据说这种大象便便咖啡口感不苦,还具有牛奶巧克力、坚果、以及红浆果和少许香料的芳香。那么如此昂贵的咖啡到…

25张高清壁纸:清新大自然意境唯美简洁素雅~

展开全文免责声明:文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。本声明未涉及的问题参见国家有关法律法规,当本声明与国家法律法规冲突时,以国家法律法规为准。

关于企鹅的高分电影推荐:没有最萌,只有更萌!

本周新片萌萌哒担当 当然是帝企鹅啦! 《帝企鹅日记2》 适合各个年龄段观影! 电影博物馆影城 正在预售~这么可爱的企鹅, 当然get了超多电影啦! 今天跟着小编一起了解一下~ 【关于企鹅的高分电影推荐】帝企鹅日记2:召唤 展开全文导演: 吕克雅盖 主演: 朗贝尔维尔森 /…

文旅大餐已备好!中山特色镇街等你来打卡(飞跃伶仃洋⑩)

近日,文旅君推出“飞跃伶仃洋,中山欢迎您”系列,聚焦中山各镇街擦亮文旅新风景、打造城市新形象、迎接发展新机遇的风采。今天,文旅君带您到沙溪镇和大涌镇打卡探秘。 沙溪镇因境内有沙溪涌而得名,建于南宋(1152年),距今已有870余年历史,拥有鹤歌鹤舞、沙溪凉茶、“四…

主板中的HL2 电解电容器 铝电解电容器 电解电容技术详解

展开全文主板中的HL2电解电容技术详解 一、望闻问切—电容问题引起主板“体虚” 病征:直观表现为液态电解电容膨胀、过热、漏液。 致病缘由:高温、电解电容用料不足。 病理分析:主板供电电路设计缺陷,导致电容工作环境温度过高,电容发热,从而使液态电容中的电解液挥发而失…

零距离观察054A盐城舰细节 垂发系统近在眼前

网友上传了参观中国海军盐城舰的照片,盐城舰属于054A型导弹护卫舰,是中国海军主力装备。(感谢超大军事 monkeyking)网友上传了参观中国海军盐城舰的照片,盐城舰属于054A型导弹护卫舰,是中国海军主力装备。(感谢超大军事 monkeyking)展开全文网友上传了参观中国海军盐城舰的照片…

揭秘一代女皇武则天的荒淫史【正文】

在中国悠久的历史长河中,武则天无疑是一位极具传奇色彩的女性。作为唐代著名历史人物之一,她曾是唐太宗李世民的爱妃,后来又被册封为皇后、太后,甚至以女性身份登上帝位,成为中国历史上唯一的女皇帝。 贞观十一年(637年),年满14岁的武则天被选入唐太宗李世民的后宫,封…

20道家常汤,营养美味,简单易做,太赞了先收藏

今天吃什么?我来帮你选! 每天营养师为你搭配“一日三餐” 夏天是一个进补的季节,早晚温差大,气候凉爽也较为干燥,这个时候就适合多喝汤!而说到汤,广东人绝对是行家!做法简单,一学就会,老人孩子在这个季节一定要多喝(增强体质和免疫力)。冬瓜火腿汤 食材准备:冬瓜1…

裸聊诈骗视频会被发出去吗?QQ裸聊视频和照片会被发通讯录吗?

裸聊诈骗令人闻风丧胆,谈裸色变。因本人恰好从事刑事辩护工作,在工作中积累了形形色色的电信敲诈勒索办案经验,只能说随着工作经验的积累,对于电信敲诈勒索的套路了解的越多,对电信敲诈勒索模式了解的越透彻,对于敲诈勒索集团的组织架构、规章制度、利益分配、勒索手段和…

旧事照片:北京天安门老照片集

这一百年来中国发生了天翻地覆的变化,就连天安门的样子也变化不少。 天安门是明清两代北京皇城的正门,始建于明朝永乐十五年(1417年),最初名“承天门”,寓“承天启运、受命于天”之意。设计者为明代御用建筑匠师蒯祥。清朝顺治八年(1651年)更名为天安门。1900年。 这一…

2024年广东深圳成人高考热门院校和专业有哪些?

深圳为成人学习者提供丰富的专升本教育机会。2024年,深圳的成人专升本院校包括深圳大学、暨南大学等。其次,选择专业同样重要,涵盖视觉传达设计、工商管理等多个领域。同学们应根据兴趣和职业规划确定专业方向,再筛选院校。同时,需注意各院校的学位申请要求,如平均分、外…

45种液压原理动图分享,非常直观!

一个完整的液压系统由五个部分组成,即动力元件、执行元件、控制元件、辅助元件和液压油。动力元件的作用是将原动机的机械能转换成液体的压力能,指液压系统中的油泵,它向整个液压系统提供动力。 执行元件(如液压缸和液压马达)的作用是将液体的压力能转换为机械能,驱动负载…

初中英语7-9年级上册超全语法梳理!建议收藏!(可下载打印)

您是家长吗?是!就点标题下方蓝色的 家长慧三字,然后点关注,您就可以享受到我们为您提供的最新教育和健康等信息 今天老师给大家整理了:初中英语7-9年级上册超全语法梳理。 老师已为大家备好电子打印版,想要获取电子打印版请拉到文末查看。 七年级英语上册知识总结 Unit 1…

感恩母校行(128)| 走进杭州市余杭第二高级中学

邮寄时间:2024.1.30 团队编号:115 寄信人: A22资环2 王 晟 B22中文3 何嘉怡 B22中文2 张心怡 A22化工3 滕佳怡 A22资环1 陈唯微 A22能动 王以恒 收信地:杭州市余杭第二高级中学 高中母校概况 杭州市余杭第二高级中学是浙江省一级特色示范高中,浙江省一级重点中学,地处杭州…

如何购买足球彩票实现盈利?

在即将结束的世界杯赛季,回顾这一年的精彩瞬间,许多朋友可能会好奇地询问如何参与体育彩票投资以实现盈利。四年前,我曾分享过有关体育彩票和赔率的基础知识,但今天的主题将更深入地探讨这一问题。 博彩公司的盈利之道: 你可能觉得博彩公司通过操纵比赛结果来赚取利润,但…

特制12首月亮歌,超好听!最美月亮大全!祝中秋快乐!

12首月亮之歌 独家,特制 好听,好看 祝中秋快乐 曲目 01-邓丽君-月光恋曲 02-邓丽君-月儿像柠檬 03-邓丽君-明月千里寄相思 04-邓丽君-明月来看我 05-邓丽君-月下情歌 展开全文06-邓丽君-月下送君 07-邓丽君-月夜诉情 08-邓丽君-月圆花好 09-邓丽君-热情的月亮 10-邓丽…

世界十种怪猫,第10种很受宠爱

很多人都喜欢猫,尤其是奇特品种。长得越丑长得越奇怪的越喜欢,这些奇怪的猫以它们特有的方式吸引着我们的目光。来看看这些都是些什么怪猫。 1.【精灵猫】精灵猫是非常罕见的家养猫咪,主要集中在北美洲。精灵猫奇怪的外貌是由斯芬克斯猫和美国卷耳猫杂交的结果。 2.【柯尼斯…

逛澳门最浪漫展厅,展开一场“美丽变身”之旅!(来源: 新闻局)

假日在澳门走走,除了游览景点,品尝美食,其实到澳门科学馆探索也是不错的选择。 澳门科学馆于2022年先后获中国科协列入“全国科普教育基地”及“科学家精神教育基地”,同年12月底,更获批加入中国科技文化场馆联合体。展开全文科学馆设有14个展厅、天文馆,以及儿童世界游乐…

我国天然橡胶行业呈新常态化发展趋势 进口局势仍将持续但供应压力将逐步缓解

一、行业相关定义 天然橡胶(NR)是一种以顺-1,4-聚异戊二烯为主要成分的天然高分子化合物,其成分中91%~94%是橡胶烃(顺-1,4-聚异戊二烯),其余为蛋白质、脂肪酸、灰分、糖类等非橡胶物质。天然橡胶是应用最广的通用橡胶。 根据观研报告网发布的《中国天然橡胶行业发展趋…

狗的生殖器官与生育过程

: 本文将为您介绍狗的生殖器官构造及其主要功能,以及它们在繁殖过程中的作用。狗的生殖器官包括子宫内膜、子宫颈、阴道、尿生殖前庭和阴门等部分。这些器官在发情前期、发情期、发情后期和发情间期等不同阶段会发生显著变化,以适应繁殖需求。 在发情前期,尤其是受精后,子宫…