我是一個辛勤的搬運工---post請求中header攔截器(三)

一般網上給的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);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章