Android Retrofit Post請求引數長度限制問題 retrofit sendto failed: ECONNRESET (Connection reset by peer)
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請求