困擾了我快兩個多月的問題解決了,特此記錄下來:
要傳輸嵌套的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<RspModel> deviceAdd(@PartMap Map<String, RequestBody> params,@Part MultipartBody.Part[] parts);
params:表單字段集合 。 parts:文件數組
Map<String, RequestBody> params=new HashMap<>(); RequestBody k1Body = RequestBody.create(MediaType.parse("text/plain"), "v1"); params.put("k1",k1Body); for(int i = 0; i <K3List.size() ; i++){ RequestBody k3Body = RequestBody.create(MediaType.parse("text/plain"), K3List.get(i).getAa1(); params.put("k3["+i+"]"+"[aa1]",valueName); ... } MultipartBody.Part[] parts=new MultipartBody.Part[images.size()]; for (int i = 0; i < images.size(); i++) { //images:文件路徑集合 ... RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file); MultipartBody.Part filePart = MultipartBody.Part.createFormData("images", file.getName(), requestFile); parts[i]=filePart; }