如何将Map <string,string =“”>转换为RequestBody?

时间:2018-11-01 13:44:51

标签: java android retrofit2 okhttp3

使用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等不是一种选择。

2 个答案:

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