關於retrofit進行網路請求時發生的奇怪錯誤
阿新 • • 發佈:2019-01-10
在我們進行的網路請求中,伺服器得到的資料是亂的,具體混亂格式及情況如下:
1.api介面如下:
2.建立retrofit例項:
3.網路工具類的單例化
4.提供一個對外的方法
5.在activity裡面呼叫api及網路工具類
然後我們傳入一個map集合到getallcar方法裡面,然後伺服器收到了一串亂碼,然後我和後臺對接了半天,發現原因如下:
1.後臺介面有問題
2.後臺收到資料沒轉碼
3.網路框架有漏洞
4.我這邊沒轉碼
最後我們一一排查,發現
1是沒有問題的,因為ios那邊上傳同樣介面,並沒有出現亂碼的問題。排除這個問題
2這個方案的話,和後臺交流之後,他同意轉碼,並且成功返回介面資料,但是如此將會導致其他前端訪問資料出現問題,比如這一次它後臺轉碼之後,web端訪問資料時就出現了亂碼。所以此方案不可行。
3.當排除前面這兩種情況之後,到第三種時候,突然發現好傻,square公司不可能出現這種低階錯誤。所以,排除這個問題
4.最後一個解決方案,當然,到了這步確實解決了,不過試了很久才發現問題解決了。首先是我這邊明文將map裡面的元素轉碼,實驗之後不可行。然後我開始用
@FormUrlEncoded + 請求引數為
@FieldMap Map<String,Object> map 來解決這方案接近正確,但是還是缺少最重要的一步,那就是新增請求頭用來轉碼了,也就是:
@Headers("Content-Type: application/json; charset=utf-8")最後,問題解決。
將api格式請求從:
@POST("traceList") Call<CarTraceListEntity> getCarTraceList(@QueryMap Map<String,Object> map);改為:
@FormUrlEncoded @Headers("Content-Type: application/json; charset=utf-8") @POST("traceList") Call<CarTraceListEntity> getCarTraceList(@FieldMap Map<String,Object> map);問題解決。