关于retrofit进行网络请求时发生的奇怪错误

来源:互联网 发布:移动宽带看网络电视 编辑:程序博客网 时间:2024/05/22 09:06

在我们进行的网络请求中,服务器得到的数据是乱的,具体混乱格式及情况如下:

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);
问题解决。

原创粉丝点击