payload -->@Body
最近有個請求是post 還帶query參數(shù)的用retrofit 一開始想的是
@FormUrlEncoded
@POST("/test")
Observable<String> getResult(@Field("test")String test,@Field("test2") String test, @Body RequestBody body);
后面發(fā)現(xiàn) @FormUrlEncoded 和 @POST沒有辦法一起用户辫,可以考慮使用攔截器給它加參數(shù)
public class MyInterceptor implements Interceptor {
@NotNull
@Override
public Response intercept(@NotNull Chain chain) throws IOException {
Request requests = chain.request();
// 添加Query參數(shù)
HttpUrl httpUrl = requests.url()
.newBuilder()
.addQueryParameter("paramter", "paramter")
.addQueryParameter("paramter1", "paramter")
.addQueryParameter("paramter2", "paramter")
.build();
// 添加Header參數(shù)
Request request = requests.newBuilder()
.url(httpUrl)
.build();
return chain.proceed(request);
}
}
需要注意的是這種方法可能會導(dǎo)致其它后面加的攔截器失效的問題
經(jīng)過一下午后才發(fā)現(xiàn)有一種更方便的方式 : 直接在post請求里加@Query 以前一直以為@Query 只能和get一起使用
原地址Retrofit2 post請求在url里面帶上參數(shù)的問題
好的最后發(fā)現(xiàn)校驗一直沒有辦法過 發(fā)現(xiàn)是因為base64編碼后最后有一個= 變成了%3D 導(dǎo)致服務(wù)器解析失敗
因此一直在想辦法去解決retrofit自動urlencode 的問題浪漠,經(jīng)過搜索有以下這樣一種方式,但是對我來說并不適用,原因的話是因為聲明encoded= true 是一個建議值,經(jīng)過校驗如果覺得你還需要encoded 那照樣給你encoded
@POST("/test")
Observable<String> getResult(@Field("test")String test,@Query(value = "test2",encoded = true)String test, @Body RequestBody body);
詳情見:
Retrofit2 urlencode 編碼的問題
好的這樣還不行 最后解決方式
@POST()
Observable<String> getReuslt(@Url String url, @Body RequestBody body);
還有以下方式(未檢驗):
/**
*這是需要encoded方式,常規(guī)寫法
*/
@POST("api/{url}/getList)
Observable<String> getReuslt(@Path("url") String url, @Body RequestBody body);
/**
*這是不需要encoded方式
*/
@POST("{url}")
Observable<String> getReuslt(@Path(value = "url", encoded = true), @Body RequestBody body);