Android retrofit2 嵌套表单加文件传输

困扰了我快两个多月的问题解决了,特此记录下来:

 

要传输嵌套的json+图片数据,下面这种json:

{
"k1": "v1",
"k2": "v2",
"k3": [{
"aa1": "vv1",
"aa2": "vv2"
}, {
"aa1": "vv11",
"aa2": "vv22"
}]
}

如果直接传json的话是没办法和文件一起传输的。

如果表单传输的话只能传键值对,嵌套数据就不知道怎么传了(找不到)。

后台是php,只传json可以成功,传表单(第一层json)加图片也可以成功。(java后台是没有这种扫操作的,我来写的话!)

关键苹果端实现了,问怎么传的,他说:很简单,先拼成json,然后系统自带的转成表单。

看了retrofit2、okhttp源码方法,还是一脸懵逼。很是无奈。

最后通过抓数据包,查看数据怎么形式传递的,才找到解决方法。

-----------------------------------------------------------------------------------------------

直接看这里:

怎么用表单传输嵌套的数据?

如果不需要传文件的话,就直接拼成json传。

举例数据:

json

{
"k1": "v1",
"k2": "v2",
"k3": [{
"aa1": "vv1",
"aa2": "vv2"
}, {
"aa1": "vv11",
"aa2": "vv22"
}]
}

转成表单,与上面键值对应:

键(key):k1 , 值(value):v1。

键:k3[0]aa1  , 值:vv1。

键:k3[1]aa1, 值:vv11。

……

所以只需要拼成对应的键和对应值传就ok。

 

我网络请求用的retrofit2,这里直接用retrofit2举例。

 

post请求:

@Multipart
@POST("url")
Observable deviceAdd(@PartMap Map params,@Part MultipartBody.Part[] parts);

params:表单字段集合 。  parts:文件数组

Map params=new HashMap<>();
RequestBody k1Body = RequestBody.create(MediaType.parse("text/plain"), "v1");
params.put("k1",k1Body);
for(int i = 0; i  
  

 

 

你可能感兴趣的:(笔记,bug解决,Androidsstudio)