1. 程式人生 > >客戶端Http請求失敗原因總結

客戶端Http請求失敗原因總結

幾天沒寫部落格了,最近看到有同學問http請求失敗是怎麼回事,於是想寫一篇關於http請求失敗各種原因的文章,廢話不多說,寫起來

一.訪問伺服器形式

    1.向伺服器請求資料,是域名訪問還是IP訪問

           域名是否正確,IP地址是否正確,埠是否與伺服器端匹配,這是由於不停的在開發環境、測試環境,或者生產環境來回切換導致的,比較容易排查

    2.拼接字元是否有誤

          大小寫字母,單詞拼寫,比如,succes,結果寫成success,這個真有

二.URL地址格式

    1.地址中是否缺少或者多餘“/”,或者有其他不相干的多餘欄位。以get請求為例,正確的如下:  

             http://www.xxxx.com/search?key1=val1&key2=val2&key3=val3

             一些錯誤的:

             http:www.xxxx.com/search?key1=val1&key2=val2&key3=val3     (http:的後面少“//”,確實有這樣的情況)

             http:/www.xxxx.com/search?key1=val1&key2=val2&key3=val3    (http:/的後面少“/”)

   2.包含中文的url地址

         對包含中文的url地址,可能會出現瀏覽器請求成功,而客戶端請求失敗情況,這時,要檢視是否對包含中文的URL進行編碼

         為什麼瀏覽器可以請求成功?

              瀏覽器內部預設對URL進行編碼

        為何客戶端請求失敗?

             在編寫http網路程式碼時,需要自己對URL進行編碼處理,使用URLEncoder.encode(url,charset)。如果沒有,URL地址很可能存在亂碼,導致請求無法響應

             很多網路請求框架,實際上其內部已經對URL地址進行了統一編碼

             比如:URL編碼前,http://www.xxxx.com/search?scope=bbs&q=java語言

                         URL編碼後,http://www.xxxx.com/search?scope=bbs&q=java%E8%AF%AD%E8%A8%80

三.請求引數

    1.get請求,是在URL地址後,以“?”形式攜帶引數,如下:

        簡單點的,http://www.xxxx.com/search?key1=val1&key2=val2&key3=val3

        複雜點的,http://www.xxxx.com/search?data={xxx}            ({}中的內容由伺服器端制定或者客服兩端協商的,一般是json資料)

        而下面這種形式,是錯誤的地址

        http://www.xxxx.com/search??key1=val1&key2=val2&key3=val3     (多餘一個“?”)

    2.post請求時,可能涉及比較多的引數鍵值對,這時,檢視是否漏掉某個引數,與伺服器開發人員一一確認,不要嫌麻煩,一定要的

    3.請求傳參時,確認引數是否是必傳值或者非必傳值,或者有預設傳值,引數值型別需要注意,比如需要傳遞整型,結果傳遞字串

四.請求header是否要設定

    1.header的鍵值是否正確,header的鍵,也就是名字,一般固定。而header值不確定,有固定值的儘量複製,對不固定值的,確保獲取header值方法或者生成規則無誤

    2.多個網路請求使用同一header時,header值是否發生新的改變。比如一個網路請求時改變了header值,導致需要同一header的另一請求無法獲得正確響應

    3.多個網路請求有不同的header,是否只設置自身請求所需要的header,不設定不必要的header。這點,如果伺服器有嚴格的header校驗機制,一旦傳遞多餘header,也會

    4.導致請求失敗,如果沒有校驗,僥倖成功響應,也最好不要多傳無用的header

五.是否htts請求

    需要證書的,新增必要的安全訪問機制

 好了,以上是實際開發可能遇到小問題,有些是粗心大意造成的,有些是程式碼不嚴謹留下的bug,但不可否認正是這些細節浪費了寶貴的時間,為此整理下,方便以後的開發除錯。可能有些沒有涉及到的問題,有想法或者有興趣的小夥伴可以一起探討下,後續我會更新上來..