1. 程式人生 > >Android Retrofit Post請求引數長度限制問題 retrofit sendto failed: ECONNRESET (Connection reset by peer)

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請求