一般網上給的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);