retrofit post請求
阿新 • • 發佈:2019-01-10
一般網上給的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其他用法(如上傳檔案,以後再行記錄)。