如何将Map<String, String>转换为RequestBody?

3

我正在使用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类型。因此发送JSONMessagePack等不是一个选择。


@buzzingsilently 感谢您提供的资源,但它并没有解决这个问题。 - potatoPC
你应该将第二个map的值转换为RequestBody,并将该map作为api请求的另一部分map。 - Ankit Mehta
@AnkitMehta 在Wireshark中看起来像是在请求完成后所有不同的PartMap都被合并成了一个。我会检查后端应用程序的行为并尽快回复。 - potatoPC
当然。如果可以,请告诉我它是否有效... - Ankit Mehta
那么,它成功了吗? - Ankit Mehta
显示剩余4条评论
2个回答

5

假设您有以下地图,您想将这些数据发送到Retrofit请求体中:

HashMap<String, String> map = new HashMap<>();
map.put("key1", "value1");
map.put("key2", "value2");
map.put("key3", "value3");
map.put("key4", "value4");

以下是URL请求方法:
@FormUrlEncoded
@POST("/yourapiname")
Call<ResponseObj> methodName(@FieldMap HashMap<String, String> yourHasMapObject);

如果您想添加文件和哈希映射,则可以使用以下方法:
@Multipart
@POST("yourapiname")
Call<ResponseObj> methodName(@HeaderMap HashMap<String, String> yourHasMapObject, @Part MultipartBody.Part file);

明白了,另一个选项是使用头部,在请求体中发送多部分数据?你能接受这个解决方案吗? - aanshu
1
好的方案。我认为这可能有效。只是为了确保我们在同一个页面上。您建议不要在@PartMap中使用subMeta键和subMetaMap值对,而是将其放在标头中,并从后端应用程序中获取它。这样对吗? - potatoPC
我已经更新了答案,请看一下,我很有信心它会起作用,我也在使用这种方法。 - aanshu
@HeaderMap 可以使用,但我还有另一个问题。一个大的 header 可能会导致 HTTP 服务器断开连接。你如何处理这个问题? - potatoPC
1
真的,地图的尺寸几乎是KiB。 - potatoPC
显示剩余9条评论

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接