postpostman传递数组对象_okhttp传递数组参数采⽤okhttp+rxjava+retrofit向后台传递字符串数组参数,格式如下
{
"list": ["xxx","yyy"]//value是个字符串数组
}
最初定义了⼀个
List list = new ArrayList<>();
然后转成字符串
String str = String();
json转换对象但是这样得到的结果是
{
"list": "["xxx","yyy"]"//value变成了字符串
}
⽐较以上两种格式,发现格式不对.传给后台时,总是报参数错误的异常.
解决办法:定义⼀个对象继承⾃okhttp3.RequestBody
public class DefaultRequestBody extends okhttp3.RequestBody{
public List list;
@Nullable
@Override
public MediaType contentType() {
return MediaType.parse("application/json; charset=utf-8");
}
@Override
public void writeTo(BufferedSink sink) throws IOException {
}
}
通过Retrofit定义请求接⼝API
@FormUrlEncoded
@POST("url")
Observable request(@body DefaultRequestBody body);
打开PostMan,输⼊url,输⼊请求参数,选择Body,选择raw,选择JSON(application/json)
输⼊json格式的参数,点击右侧的[code]查看,选择[java ok http],如图
关键的代码:
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody
.create(mediaType, "{"list": ["xxx","yyy"]}");
create⽅法的第⼆个参数就是我们的对象DefaultRequestBody转换后的json字符串.
//Gson转换⾃动处理了字符串数组,不会出现上⾯那种value格式错误
String json = le.Gson().toJson(new DefaultRequestBody());
上⾯定义的接⼝request API中传⼊的是对象DefaultRequestBody,我们在okHttp的⾥做转换public class DefaultIntercept extends okhttp3.Intercept{
@Override
public Response intercept(Chain chain) throws IOException {
Request request = quest();
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 = ate(mediaType,json);
//传递body,重新⽣成request请求
request = wBuilder().post(body).build();
}
return chain.proceed(request);
}
}
解决了传递字符串数组的问题

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。