okhttp傳遞數組參數

採用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);
        } 
    }

解決了傳遞字符串數組的問題

相關文章
相關標籤/搜索