記一次http介面除錯問題
在開發工程中,在開發工程中,我們經常會遇到和其它第三方廠家有介面資料來往的情況。這是一次我們作為客戶端去獲取另一個廠家推流的直播地址的介面,這個介面情況有些不一樣,我們需要在一個介面中封裝兩次http請求,大概場景是這樣的:
第一次呼叫方式是POST,第二次是Get,第一次呼叫會獲取到一個地址,返回結果類似這樣的:
這裡獲取到介面返回一個帶引數的地址,這裡注意一下,這個地址裡有些特殊符號,如:下劃線、等號之類的等等。我們還需要將返回的這個帶引數的URL地址作為第二個請求的URL,並攜帶上第二個請求播放介面要求的請求引數使用get方式呼叫介面請求從而獲取到一個重定向的地址,請求地址類似這樣的:
http返回碼應該是302,這個地址才是真正的播放地址,其實是一個m3u8的播放流。對方通過這樣的一個地址進行推流播放。很快這個介面封裝好了,自己寫了個單元測試進行呼叫測試;在做單元測試的過程中發現最終的返回碼是200,而且響應的報文是空的,什麼資訊都沒有。正常應該是返回302, 單獨測試第一個介面的時候響應是正常的,測試第二個的時候出問題了,反覆確認封裝的請求引數是沒有問題的,開始懷疑是對方響應有問題。後來我單獨用第一個返回的地址帶上引數在瀏覽器中請求是可以的,於是知道大概是URL被轉碼了的原因,因為第一個介面返回的地址是帶了引數的,如上面引數裡有很多特殊字元。我在請求的時候自己封裝了一個httpclient工具類,裡面有封裝的帶引數的get方法是這樣寫的:
這裡在構造請求時使用的是 java.net.URI 來構造的,而經過查詢,從jdk的一個bug回覆中知道:JDK-8132508 : Bug JDK-8029354 reproduces with underscore in hostname
說明了java.net.URI 的域名只能由 字母 (A-Z), 數字(0-9), 減號 (-), 和 點 (.) 組成。也就是說 java.net.URI 驗證了 hostname。同時也看到了在 java.net.URL 中不會做這個驗證。所以問題找到了,所以我們把這個方法換成其它方式來構造就正常返回了。
贊同提交bug的網友的意見,這樣會隱藏很多的坑。為什麼一個驗證了域名一個卻不做驗證。我們也看到bug提交之後得到回覆這不是一個bug。
以上所述是小編給大家介紹的Spring Boot 模組組成,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回覆大家的!
Java學習資料獲取(複製下段連線至瀏覽器即可)
data:text/html;charset=UTF-8;base64,5p625p6E5biI5a2m5Lmg6LWE5paZ5YWN6LS56aKG5Y+W6K+35Yqg5omj5omj5Y+35pivMTAxODkyNTc4MA==