在我们进行的网络请求中,服务器得到的数据是乱的,具体混乱格式及情况如下:
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); 问题解决。