使用Retrofit 2.4.0,我正在提出@Multipart
@POST
请求。我正在以@Part
格式发送文件,并以@PartMap
格式发送一些元数据。这就是通话的样子。
@Multipart
@POST("https://8hoot.com/my-path")
Single<Response<UploadMediaResponseModel>> uploadMedia(
@PartMap Map<String, RequestBody> metadata,
@Part MultipartBody.Part filePart
);
还有另一个Map<String, String>
,我们称之为subMetaMap
,其中包含相关的键值对。
如何将此subMetaMap
存储在@PartMap
metadata
中?如下所示。
RequestBody subMetaMapAsRequestBody; // Convert subMetaMap to RequestBody
metadata.put("subMeta", subMetaMapAsRequestBody);
当前,我正在使用以下方法。
for (String s : subMetaMap.keySet()) {
RequestBody requestBody = RequestBody.create(MultipartBody.FORM, subMetaMap.get(s));
metadata.put(s, requestBody);
}
这不是理想的解决方案,因为我希望整个subMetaMap
成为RequestBody
,而不是其各个键值对
编辑1 -后端团队在Multipart
请求期间未采用其他MIME类型。因此,发送JSON
,MessagePack
等不是一种选择。
答案 0 :(得分:3)
假设您有以下地图,希望将此数据发送到改装请求正文
public void Poll()
{
MyTcpClass objClass = (MyTcpClass)Application["MyTcpClass"];
//If objClass is null, recreate/reconnect it
objClass.Poll();
}
以下是URL请求方法:
HashMap<String, String> map = new HashMap<>();
map.put("key1", "value1");
map.put("key2", "value2");
map.put("key3", "value3");
map.put("key4", "value4");
如果要添加文件和哈希图,请使用以下方法:
@FormUrlEncoded
@POST("/yourapiname")
Call<ResponseObj> methodName(@FieldMap HashMap<String, String> yourHasMapObject);
答案 1 :(得分:0)
您应该以传递第一张地图的相同方式传递另一张地图。
首先,将第二个映射的值从String
转换为RequestBody
,然后您的请求应如下所示:
@Multipart
@POST("https://8hoot.com/my-path")
Single<Response<UploadMediaResponseModel>> uploadMedia(
@PartMap Map<String, RequestBody> metadata,
@PartMap Map<String, RequestBody> anotherMetaData,
@Part MultipartBody.Part filePart
);