retrofit sendto failed: ECONNRESET (Connection reset by peer)【android客户端Post请求参数长度限制(参数过大)】解决办法
一、问题的出现
post请求后台,当参数字符太长超过900字时会报sendto failed: ECONNRESET (Connection reset by peer)错误,stroke找了很多问题结果没几个人回答,回答的也不能解决问题;
发现问题:原来,是我对Retrofit的@QueryMap() Map<String, String> params
不是很理解,使用@QueryMap()会直接放在post请求的data里面更url一起拼接,url请求有长度限制(浏览器、服务器等都有可能);
解决问题:最后发现了Retrofit2.0中还有一个@FieldMap,这个参数就是给我们的表单提交所使用的,我们是使用的是POST请求,使用FieldMap会将请求的参数封装在Request的Body中,理论上POST请求是没有长度限制的。
Post请求
@FormUrlEncoded
@POST("postService")
Call<String> postModelService(@Field("msg") String msg, @Field("string") boolean isString);
Retrofit中的Post请求则需要将前面的@GET注解换成@POST注解,而Post请求的文本参数则用注解@Field来声明,同时还必须给方法添加注解@FormUrlEncoded来告知Retrofit参数为表单参数,如果只为参数增加@Field注解,而不给方法添加@FormUrlEncoded注解运行时会抛异常。
如果Post请求有很多参数同样也可以使用集合的方式进行声明
@FormUrlEncoded
@POST("{path}")
Call<User> postModelService(@Path("path") String path, @FieldMap Map<String, String> map);
Retrofit中提供了注解@FieldMap用来声明一个Map类型的集合作为Post请求的表单参数
Post请求的服务接口声明完成之后,讲得到的Call对象调用execute或者enqueue即可发起同步或异步的Post请求