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<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;
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章