<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          一不小心又踩了個(gè)feign的坑!

          共 2978字,需瀏覽 6分鐘

           ·

          2021-12-18 09:02

          ????關(guān)注后回復(fù) “進(jìn)群” ,拉你進(jìn)程序員交流群????


          作者丨碼農(nóng)二胖

          來(lái)源丨java金融


          引言

          前陣子不是剛剛使用feign調(diào)用了第三方的接口嗎,覺(jué)得feign這玩意還挺好用,代碼寫(xiě)起來(lái)比較簡(jiǎn)單, 不過(guò)也被讀者噴啦,引入一個(gè)httpClien就能夠解決的問(wèn)題,非要搞得這么復(fù)雜。其實(shí)本來(lái)項(xiàng)目里面就是采用feign來(lái)進(jìn)行和其他業(yè)務(wù)進(jìn)行交互的,所以沒(méi)有必要再去搞一個(gè)HttpUtils。最近又收到一個(gè)需求,需要繼續(xù)接入第三方的一個(gè)視頻校驗(yàn)視頻。為啥要去接入視頻校驗(yàn),主要是比如用戶(hù)傳入一個(gè)視頻,我們需要對(duì)這個(gè)視頻進(jìn)行校驗(yàn),看看這個(gè)視頻是否合規(guī),是否涉黃、涉政等。如果這些視頻都需要人工一個(gè)個(gè)去審核的話,這樣比較耗費(fèi)人力,所以需要接入阿里云的視頻校驗(yàn)功能,通過(guò)這個(gè)來(lái)幫我們解決這個(gè)視頻是否合規(guī)的問(wèn)題。看了下文檔對(duì)接起來(lái)還是比較容易的參數(shù)也就幾個(gè)一個(gè)是視頻的url,還有一個(gè)是視頻需要校驗(yàn)的情況有哪些。

          踩坑

          背景介紹完了我們就直接接入就可以啦,三下五除二就接完了,自測(cè)了幾個(gè)小視頻看下來(lái)都是符合正常流程,然后就提測(cè)了。測(cè)試測(cè)了十幾個(gè)case也沒(méi)發(fā)現(xiàn)啥問(wèn)題,然后就跟著下一個(gè)發(fā)布版本正常發(fā)布生產(chǎn)啦,生產(chǎn)也看啦幾個(gè)視頻沒(méi)啥問(wèn)題。然后這個(gè)功能就算正式 交互完成啦。不過(guò)過(guò)了幾天就又被運(yùn)營(yíng)找上來(lái)了,說(shuō)好多突然積累啦好多視頻審核都是失敗的,我心想你肯定是不會(huì)用,上線的時(shí)候都是好好的,肯定是你操作姿勢(shì)不對(duì)。嘀咕歸滴咕問(wèn)題還是需要去解決的。首先打開(kāi)下日志發(fā)現(xiàn)好多報(bào)錯(cuò)都是返回同一個(gè)錯(cuò)誤碼,但是也有調(diào)用成功的。既然是第三方返回的報(bào)錯(cuò)那肯定是第三方的bug了,如果是我寫(xiě)的bug那肯定都會(huì)是校驗(yàn)失敗的就不會(huì)存在部分成功和部分失敗啦。所以我隨手挑了一個(gè)報(bào)錯(cuò)的case,把請(qǐng)求參數(shù),以及請(qǐng)求返回結(jié)果扔給第三方讓他們幫忙查下是啥問(wèn)題。讓人家排查問(wèn)題最起碼的東西還是需要提供的,比如調(diào)用時(shí)間、請(qǐng)求參數(shù)、請(qǐng)求接口等這信息。有了這些信息人家才能更方便快捷的幫你定位問(wèn)題。但是在公司里面往往業(yè)務(wù)方找你排查問(wèn)題就是直接@你,調(diào)用你的接口報(bào)錯(cuò)了,趕緊解決下。不說(shuō)哪個(gè)環(huán)境?也不說(shuō)哪個(gè)接口?也不發(fā)下請(qǐng)求參數(shù)。反正啥都沒(méi)有,就是你的問(wèn)題,趕緊給我解決就行。但是這樣往往都是自己漏傳了這個(gè)參數(shù),或者是自己環(huán)境不對(duì)。找人幫你定位問(wèn)題,問(wèn)題三要素至少要說(shuō)清楚吧?至少需要先自己排查下是否是你的問(wèn)題吧?這應(yīng)該是作為程序員最基本的素養(yǎng)吧!扯遠(yuǎn)啦回到正題。畢竟花錢(qián)了的,作為第三方排查生產(chǎn)問(wèn)題響應(yīng)速度還是可以的,立馬就定位到問(wèn)題了。原來(lái)是我提交過(guò)去的視頻鏈接打不開(kāi),導(dǎo)致無(wú)法被校驗(yàn),所以返回校驗(yàn)失敗。但是我根據(jù)我這邊記錄的日志這個(gè)視頻鏈接是可以打開(kāi)的。我馬上讓他們把他們接受到的參數(shù)發(fā)給我下,然后和我這邊記錄日志的鏈接對(duì)比下:

          我們可以發(fā)現(xiàn)不同點(diǎn)就是在最后幾個(gè)字母,知道的朋友肯定一眼就能看出問(wèn)題所在了,第三方接受到的URL是被decode了,然后我們自己這邊的URL能打開(kāi)的話就是這個(gè)鏈接有些特殊字符需要被encode之后才能被打開(kāi),如果直接decode之后就不能夠打開(kāi)了。然后找第三方的人確認(rèn)是否他們有對(duì)我們的參數(shù)進(jìn)行decode,最終得到的結(jié)論是沒(méi)有。那難道是我們代碼的問(wèn)題,仔細(xì)檢查了下代碼發(fā)現(xiàn)了這么一行可能有影響的代碼

           @PostMapping(value = "xxxx", produces = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
              Response submit(@SpringQueryMap VideoValidationSubmitReq req);

          這個(gè)produces是按照提供的文檔接入的看下來(lái)應(yīng)該沒(méi)啥問(wèn)題。然后通過(guò)POSTMAN調(diào)試一把也沒(méi)有復(fù)現(xiàn)出問(wèn)題,那問(wèn)題肯定是出在feign調(diào)用的過(guò)程中啦。源碼之下無(wú)秘密,經(jīng)過(guò)上次踩坑事件,《feign的一個(gè)注解居然隱藏這么多知識(shí)!》閱讀過(guò)源碼,這次閱讀它的源碼就有點(diǎn)輕車(chē)熟路了,最終很快就定位到問(wèn)題了。最終定位到問(wèn)題的關(guān)鍵代碼是這一行,

          UriUtils.encode

          我們可以進(jìn)入這個(gè)方法首先看看這個(gè)方法的注釋我們就明白其中的原因所在了:如果需要進(jìn)行encode的參數(shù)已經(jīng)是被encode了就不會(huì)被繼續(xù)被encode了,直接跳過(guò)這個(gè)字符。很明顯上述我們的參數(shù)已經(jīng)是有部分已經(jīng)被encode了,然后在通過(guò)feign傳過(guò)去之后只有沒(méi)有被encode 的參數(shù)才會(huì)繼續(xù)encode,這樣就會(huì)導(dǎo)致第三方服務(wù)端那邊接受到這邊的參數(shù)再經(jīng)過(guò)decode所以我傳過(guò)去的URL參數(shù)就全部被解密了。全部解密后然后就導(dǎo)致url解析后失敗了,不能夠被正常打開(kāi)了。找到原因了我們解決問(wèn)題就比較簡(jiǎn)單了,既然feign使用的encode不能滿(mǎn)足我們的要求,我們就不使用它的提供的方法,本著快速解決bug的原則然后把produces 指定為application/json;charset=UTF-8",然后把參數(shù)通過(guò)手動(dòng)調(diào)用URLEncoder.encode(xxx,"utf-8")把參數(shù)傳給第三方。這個(gè)方法如果已經(jīng)被encode的字符串也會(huì)繼續(xù)第二次encode并不會(huì)和UriUtils.encode一樣遇到已經(jīng)被encode的字符就直接不encode了。快速修復(fù)完這個(gè)bug然后讓測(cè)試幫忙測(cè)了一把沒(méi)啥問(wèn)題,趕緊發(fā)布到生產(chǎn)去,不然運(yùn)營(yíng)人員一直催個(gè)不停。代碼被發(fā)布上去之后,把校驗(yàn)失敗的視頻改下?tīng)顟B(tài),然后手動(dòng)觸發(fā)下job讓它重新跑一下,觀察了一會(huì)全部校驗(yàn)通過(guò)。幸好我當(dāng)時(shí)多了個(gè)心眼留了個(gè)后門(mén)可以通過(guò)job重新拉取校驗(yàn)失敗的視頻。這個(gè)bug總算修復(fù)了,雖然解決的不是很完美,但是先把問(wèn)題修了再說(shuō),后續(xù)再去研究下比較優(yōu)雅的解決方法,還得趕緊跟領(lǐng)導(dǎo)去解釋原因去?不然年終獎(jiǎng)不知道還有么有?

          結(jié)束

          • 由于自己才疏學(xué)淺,難免會(huì)有紕漏,假如你發(fā)現(xiàn)了錯(cuò)誤的地方,還望留言給我指出來(lái),我會(huì)對(duì)其加以修正。
          • 如果你覺(jué)得文章還不錯(cuò),你的轉(zhuǎn)發(fā)、分享、贊賞、點(diǎn)贊、留言就是對(duì)我最大的鼓勵(lì)。
          • 感謝您的閱讀,十分歡迎并感謝您的關(guān)注。

          -End-

          最近有一些小伙伴,讓我?guī)兔φ乙恍?nbsp;面試題 資料,于是我翻遍了收藏的 5T 資料后,匯總整理出來(lái),可以說(shuō)是程序員面試必備!所有資料都整理到網(wǎng)盤(pán)了,歡迎下載!

          點(diǎn)擊??卡片,關(guān)注后回復(fù)【面試題】即可獲取

          在看點(diǎn)這里好文分享給更多人↓↓

          瀏覽 14
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日本欧美一级片 | 蜜桃视频成人网站入口 | 精品国产伦子伦免费看 | www…黄色在线免费观看 x8x8拨牐拨牐精品视频 | 火爆全网嫖妓达人金先生约战极品S空 |