採用okhttp+rxjava+retrofit向後臺傳遞字符串數組參數,格式以下java
{ "list": ["xxx","yyy"]//value是個字符串數組 }
最初定義了一個json
List<String> list = new ArrayList<>();
而後轉成字符串數組
String str = list.toString();
可是這樣獲得的結果是app
{ "list": "["xxx","yyy"]"//value變成了字符串 }
比較以上兩種格式,發現格式不對.傳給後臺時,老是報參數錯誤的異常.ide
解決辦法:定義一個對象繼承自okhttp3.RequestBodypost
public class DefaultRequestBody extends okhttp3.RequestBody{ public List<String> list; @Nullable @Override public MediaType contentType() { return MediaType.parse("application/json; charset=utf-8"); } @Override public void writeTo(BufferedSink sink) throws IOException { } }
經過Retrofit定義請求接口APIui
@FormUrlEncoded @POST("url") Observable<BaseResult> request(@body DefaultRequestBody body);
打開PostMan,輸入url,輸入請求參數,選擇Body,選擇raw,選擇JSON(application/json)
輸入json格式的參數,點擊右側的[code]查看,選擇[java ok http],如圖
關鍵的代碼:google
MediaType mediaType = MediaType.parse("application/json"); RequestBody body = RequestBody .create(mediaType, "{"list": ["xxx","yyy"]}");
create方法的第二個參數就是咱們的對象DefaultRequestBody轉換後的json字符串.url
//Gson轉換自動處理了字符串數組,不會出現上面那種value格式錯誤 String json = new org.google.Gson().toJson(new DefaultRequestBody());
上面定義的接口request API中傳入的是對象DefaultRequestBody,咱們在okHttp的攔截器裏作轉換spa
public class DefaultIntercept extends okhttp3.Intercept{ @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); RequestBody requestBody = request.body(); if(requestBody instanceof DefaultRequestBody){ DefaultRequestBody defaultBody = (DefaultRequestBody)requestBody; String json = new Gson().toJson(defaultBody); MediaType mediaType = MediaType.parse("application/json"); //生成RequestBody RequestBody body = RequestBody.create(mediaType,json); //傳遞body,從新生成request請求 request = request.newBuilder().post(body).build(); } return chain.proceed(request); } }
解決了傳遞字符串數組的問題