1. 程式人生 > >關於retrofit進行網路請求時發生的奇怪錯誤

關於retrofit進行網路請求時發生的奇怪錯誤

在我們進行的網路請求中,伺服器得到的資料是亂的,具體混亂格式及情況如下:

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);
問題解決。