客戶端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,但不可否認正是這些細節浪費了寶貴的時間,為此整理下,方便以後的開發除錯。可能有些沒有涉及到的問題,有想法或者有興趣的小夥伴可以一起探討下,後續我會更新上來..