400 Bad Request引發的思考

好久沒寫了,因爲最近有點迷茫,不知道爲什麼會迷茫😭求解。。。。。。哈哈,不管了進入正題,今天翻抖音看到一個視頻說距離2019年春節還有99天, HA的我到公司後趕緊算了一下確實是🙂,馬上就一年了,年初定的小      目      標🤭,“( ̄▽ ̄)” 一個表情說明一切。

最近在簡書上看到一個Retrofit2+Rxjava2+okhttp3封裝的項目,下面評論裏面有一條說運行後返回結果是400,博主回覆裏說是onNext()方法裏數據轉換的問題。以往的認知認爲返回以4開頭的狀態碼一般考慮服務端沒有正確的返回,會不會是請求的鏈接有問題或者是服務端代碼沒有處理好等等,既然以4開頭了就不應該會回調onNext()方法應該是走onError()方法纔對啊。

呵呵🙂本着學習的態度我又一次來“裝逼”了,按評論裏的描述修改代碼然後編譯運行這個項目發現確實是返回400 Bad Request,又一想會不會是我自己的想法是錯誤的,於是又按照博主的建議首先在onNext()方法打斷點調試發現程序根本不會回調onNext()方法,看來我的思路是正確的,然後看一下具體的異常是:retrofit2.adapter.rxjava2.HttpException: HTTP 400 Bad Request,有了具體的異常信息接下來看一下網上我搜索到的解決該異常的方法:

方法一:https 協議下,在url 中含有特殊符號 |,於是拋出瞭如下錯誤;但是 在http 協議下倒是不會出現該問題,查看後發現Retrofit 註解 在post 使用的時候需要 @FormUrlEncoded() + @FieldMap(),而不是使用 @QueryMap()該方法出處

這種我把https換成http後,還是會出現同樣的問題,而我把get請求換成post並且加@FormUrlEncoded註解然後把@QueryMap()替換成@FieldMap()後問題解決了。

方法二:最近項目中遇到一件怪事,在get請求中發現沒有數據,在debug時候發現居然報了一個retrofit2.adapter.rxjava

.HttpException: HTTP 400錯誤。經過查閱資料發現400 請求出錯。由於語法格式有誤,服務器無法理解此請求。不作修改,客戶程序就無法重複此請求。但是我把請求的完整參數發到postman中請求發現沒有問題。正在覺得怪異的時候,請求參數中|這個特殊字符串引起了我的注意。通過在OKhttp 攔截器中打印出本次請求路徑發現,所有的參數都是被編碼了,但是|這個特殊字符卻沒有編碼

String path = "";
try {
LogUtils.error("path" + departmentBean.getPath());
path = new String(departmentBean.getPath().getBytes(), "utf-8");
path = URLEncoder.encode(path, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}

通過對路徑參數也就是包含 | 特殊字符的參數進行編碼過後問題就解決了。該方法出處

這種方法通過測試我發現無效,可能是我添加的位置不對還是什麼原因,不是很清楚。

接下來我想說一下我的解決方案:既然是服務器沒有正確返回,首先查看鏈接是否正確,然後在看代碼中有沒有其他什麼

地方會影響到整個和服務器的交互,很快會想到攔截器:Interceptor,然後去代碼中查看有關攔截器的代碼發現有一處代碼是headerInterceptor,我想問題應該就是在這吧,開始動手修改,去掉這段攔截器的代碼,編譯運行成功,😄說明問題找到了,然後在看這塊問題出在哪,Accept-Encoding:指定瀏覽器可以支持的web服務器返回內容壓縮編碼類型,這個參數會引出另一個問題,稍後再說。Accept:指定客戶端能夠接收的內容類型,這個沒問題客戶端接收的就是json類型,接下來的Content-Type:請求的與實體對應的MIME信息,這裏有一篇不錯的介紹Content-Type的文章:https://blog.csdn.net/danielzhou888/article/details/72861097 其中有一句比較符合這個問題的描述:application/x-www-form-urlencoded : <form encType=””>中默認的encType,form表單數據被編碼爲key/value格式發送到服務器(表單默認的提交數據的格式),然後再看我們的get請求鏈接不就是在鏈接的後面以這種key/value的形式發送的嗎,🙂好了,把代碼中的Content-Type的值換成application/x-www-form-urlencoded問題解決。主要是針對get請求哈,post請求的話用application/json就沒問題了。

上面提到的Accept-Encoding的問題就是亂碼的問題,這裏有一篇文章介紹這個很不錯https://blog.csdn.net/xx326664162/article/details/81661861直接去掉,簡單    粗暴    完美,符合大多數想解決問題的小夥伴的想法:越簡單解決越好。

結束,筆芯  筆芯   筆芯

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章