1. 程式人生 > >retrofit post請求

retrofit post請求

一般網上給的demo post型請求都很簡單,沒有特殊的要去,不需要新增headers,沒有任何約束,只要參照如下幾種寫法即可:
第一種:Field

  @FormUrlEncoded
    @POST("/newfind/index_ask")
    Observable<Response> getDaJia(@Field("page") int page,
                                  @Field("pageSize") int size,
                                  @Field("tokenMark"
) long tokenMark, @Field("token") String token );

第二種:FieldMap(考慮到請求體過多,所以採用map)

 @FormUrlEncoded
    @POST("FundPaperTrade/AppUserLogin")
    Observable<Response> getTransData(@FieldMap Map<String,String> map);

以上兩種請求都是以鍵值對形式去請求,但是一般專案中post請求除了鍵值對,也還會遇到json、xml的請求,後臺也做了約束,約束其上傳格式為json/xml,無預設(防止不認識上傳的東東),所以一般要新增標頭檔案(測試必須得用fiddle,可減少一大半時間,悔~)

下面談談如何新增標頭檔案,第一種方式直接在api中請求方式之上新增,如下:

 @Headers({"Content-type:application/json",
            "Content-Length:59"})*/
    @POST("FundPaperTrade/AppUserLogin")
    Observable<Response> getTransData(@Body TestBean str);

但是這種方式不方便管理(假如所有請求都得加同一個請求頭,那肯定十分麻煩)

最好是寫一個攔截器,在其中新增header,如下:

public class
HttpInterceptor implements Interceptor {
@Override public Response intercept(Chain chain) throws IOException { Request.Builder builder = chain.request().newBuilder(); Request requst = builder.addHeader("Content-type", "application/json").build(); return chain.proceed(requst); } }

最後配置網路處加入

    client.interceptors().add(new HttpInterceptor());

好了大功告成!

最後的最後,一定要注意用json上傳,@Body中千萬不能寫String型別,否則會導致請求體構造錯誤(json格式不正確,多出\),正確寫法如下:

 @POST("FundPaperTrade/AppUserLogin")
    Observable<Response> getTransData(@Body TestBean str);

關於post其他用法(如上傳檔案,以後再行記錄)。