当前位置: 首页 > 后端技术 > Java

一不小心又踩到了feign的坑

时间:2023-04-01 17:37:33 Java

简介前阵子不就是用feign调用了第三方接口吗?一个引入一个httpClient就能解决的问题,还得这么复杂。其实feign在项目中本来就是用来和其他业务交互的,所以没必要再创建一个HttpUtils。最近,我又收到了第三方要求继续访问视频验证视频的请求。为什么要接入视频验证,主要是因为比如用户传入一个视频,我们需要对视频进行验证,看视频是否合规,是??否涉黄政治等。如果这些视频需要一个一个人工审核,会比较费人力,所以需要接入阿里云的视频验证功能,通过这个功能可以帮助我们解决视频是否合规的问题。看了文档,比较好接的参数就那么几个,一是视频的url,二是视频需要校验的情况。踩坑后台引入后,我们就可以直接访问了。三遍五遍二分之后,我们就完成了连接。自测了几个小视频,好像都符合正常流程,接下来我们开始测试。测试测试了十几个case没有发现问题,然后跟着下一个release版本正常发布production,production也看了几个视频没有问题。那么这个功能就算是正式交互了。但是过了几天,又被运营商找上门,说突然积累了很多视频,很多视频审核不通过。我心里想,你一定不能用。上网的时候还好。一定是你的操作姿势不对。.窃窃私语和返回地谷的问题还需要解决。首先打开日志,发现很多报错返回相同的错误码,但是有的调用成功了。既然是第三方返回的错误报告,那肯定是第三方的bug。如果是我写的bug,肯定验证不通过,不会有部分成功部分失败的情况,所以我挑了一个报错的case,把请求参数和请求返回结果丢给第三方请他们帮忙看看是什么问题。还是需要提供人们排查问题最起码的东西,比如调用时间、请求参数、请求接口等信息。有了这些信息,人们就可以更方便快捷地帮助您定位问题。但是在公司,业务方经常会直接@你找你排查问题,调用你的接口报错,所以赶紧解决。更何况是哪个环境?不说是哪个接口?不发送请求参数。反正也没什么,是你的问题,赶紧帮我解决吧。但是这往往是因为少了这个参数,或者环境不对。找人帮你定位问题,起码要把问题的三要素说清楚吧?至少你要先确认是不是你的问题吧?这应该是作为一个程序员最基本的素质吧!回到主题。毕竟是要花钱的,而且作为排查生产问题的第三方,响应速度还是可以接受的,第一时间定位到问题。原来是我之前提交的视频链接打不开,无法验证,所以返回验证失败。但是我可以根据我这里记录的日志打开这个视频链接。我立马让他们把收到的参数发给我,然后和我log的链接对比一下:可以发现区别在最后几个字母,知道的朋友肯定一眼就看出问题了是的,第三方收到的网址已经解码,如果我们自己的网址可以打开,说明这个链接中的一些特殊字符需要进行编码才能打开。如果直接解码,是打不开的。然后找第三方确认他们有没有解码我们的参数,最后的结论是没有。会不会是我们的代码有问题?仔细查看了代码,发现有这么一行代码可能会产生影响。@PostMapping(value="xxxx",produces=MediaType.APPLICATION_FORM_URLENCODED_VALUE)响应提交(@SpringQueryMapVideoValidationSubmitReqreq);这个产生是根据提供的文件访问好像应该没有问题。然后通过POSTMAN调试后,问题没有再出现。问题肯定出在调用feign的过程中。源代码下没有秘密。最后一步踩坑后,《feign的一个注解居然隐藏这么多知识!》阅读源码。这次对源码有点熟悉了,总算很快定位到了问题所在。最终定位问题的关键代码就是这一行。UriUtils.encode我们可以进入这个方法。首先看一下这个方法的注释就明白了,原因是:如果需要编码的参数已经编码了,就不编码了。继续编码,直接跳过这个字符。很明显,我们上面的一些参数已经进行了编码,然后只有没有编码的参数通过feign后会继续进行编码,这样就会导致第三方服务器接收到这里的参数,然后进行解码,我传入的所有URL参数都被解密了。全部解密后,url解析失败,无法正常打开。找到原因后,我们解决问题就比较简单了。由于feign使用的encode不能满足我们的要求,所以我们不会使用它提供的方法。本着快速解决bug的原则,我们将produces指定为application/json;charset=UTF-8",然后通过手动调用URLEncoder.encode(xxx,"utf-8")将参数传递给第三方)`。如果编码后的字符串已经编码过,这个方法会继续进行第二次编码。和UriUtils.encode一样,如果遇到已经编码过的字符,就不会直接编码了。赶紧修复这个bug,让测试人员帮你测试,没有问题,赶紧发布上线,不然运维人员不会罢休。代码发布后,更改验证失败视频的状态,然后手动触发job让它重新跑起来,观察一会验证都通过了。这个bug`终于被修复了,虽然解决方案不是很完美。但是我们先修复问题,然后再解释原因如果我们以后要研究更优雅的解决方案,请尽快与领导联系?不然不知道还有没有年终奖?最后,由于我的无知,难免有错误。如果大家发现自己写错了,请留言指出给我,我会改正的。如果您觉得文章还不错,您的转发、分享、欣赏、点赞、评论就是对我最大的鼓励。感谢您的阅读,非常欢迎并感谢您的关注。