Как преобразовать карту <String, String> в RequestBody? - PullRequest
0 голосов
/ 01 ноября 2018

Используя 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 - Бэкэнд-команда не принимает разные типы MIME во время запроса Multipart. Поэтому отправка JSON, MessagePack и т. Д. Невозможна.

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Вы должны пройти другую карту так же, как вы проходите первую карту.

Сначала преобразуйте значения второй карты из 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
);
0 голосов
/ 01 ноября 2018

Предположим, у вас есть следующая карта, которую вы хотите отправить этим данным в тело запроса на модификацию

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

Если вы хотите добавить файл и hashmap, используйте следующий метод:

@Multipart
@POST("yourapiname")
Call<ResponseObj> methodName(@HeaderMap HashMap<String, String> yourHasMapObject, @Part MultipartBody.Part file);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...