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

十念  金牌会员 | 2023-4-20 22:22:55 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 569|帖子 569|积分 1707


前言

在实际工作中,我们经常需要在项目中调用第三方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接口超时问题,除了给他们反馈问题,优化接口性能之外,我们更有效的方式,可能是增加接口调用的失败重试机制。
例如:
[code]int retryCount=0;do {   try {      doPost();      break;   } catch(Exception e) {     log.warn("接口调用失败")     retryCount++;   }} where (retryCount 

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

十念

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表