Можно ли отправить String [] через Multipart с помощью Retrofit?

Я разрабатываю приложение, в котором пользователь должен выбрать любое количество стран из списка, и я должен отправить выбранные имена через составную часть.

Я не загружаю какой-либо файл вместе со String [], но не существует маршрута для загрузки информации, если она не является составной, и я не могу сказать, как работает веб-сервер.

Я попытался просто отправить его как массив, ArrayList и JsonArray как таковые:

@Headers({
    "Connection: Keep-Alive",
})
@Multipart
@PUT("/user/{id}")
String updateUser(@Path("id") int userId, @Part("user[countries]") String[] countries);

Я также попытался использовать это решение, но я либо неправильно его понял, либо оно не работает. Вот код, который я пытался использовать:

ArrayList<String> countries = CountryManager.getInstance().getSelectedCountryIds();
RequestBody requestBody;
LinkedHashMap<String, RequestBody> hashMap = new LinkedHashMap<>();

for(int i = 0; i < countries.size(); i++) {
    requestBody = RequestBody.create(MediaType.parse("text/plain"), countries.get(i));
    hashMap.put("countries["+i+"]", requestBody);
}

И соответственно изменив метод дооснащения:

@Headers({
    "Connection: Keep-Alive",
})
@Multipart
@PUT("/user/{id}")
String updateUser(@Path("id") int userId, @PartMap() Map countries);

Однако во всех попытках я получал ошибку retrofit.RetrofitError: Тело детали не должно быть нулевым.

Я также упомянул, что в журнале изменений для модернизации упоминается «Новое: поддержка итераций и параметров массива @Part с использованием MultipartBody.Part OkHttp», но после некоторого покопания я обнаружил, что данный пример довольно сбивает с толку до такой степени, что я не уверен, как реализовать его в моем коде и не смог найти учебник, в котором даже упоминалась бы отправка массивов в multipart.

Такое просто невозможно?


person Larpus    schedule 14.05.2016    source источник
comment
Решение с использованием аннотации PartMap кажется правильным. Я использовал его в некоторых приложениях, и он отлично работает. Вы уверены, что все страны не нулевые?   -  person Pablo    schedule 17.05.2016


Ответы (4)


Я знаю, что опаздываю на этот ответ. вы можете использовать @Query("someKey[]") для отправки массивов в multipart. Вот рабочий пример.

@Multipart
    @POST("./")
    Call<JsonElement> addSubEvent(@Part(EndAPI.USE_CASE) RequestBody useCase,
                                  @Query("event_id[]") ArrayList<String> event_id,
                                  @Query("user_id[]") ArrayList<String> user_id,
                                  @Query("name[]") ArrayList<String> name,
                                  @Query("date_time[]") ArrayList<String> date_time,
                                  @Part("token") RequestBody token,
                                  @Part MultipartBody.Part... profilePic);

Надеюсь, это поможет тому, кто ищет ответ.

person swetabh suman    schedule 18.11.2016
comment
как разобрать Arraylist в php - person bipin; 29.03.2017
comment
Это решение не работает для меня. - person K Pradeep Kumar Reddy; 11.05.2021

создание списка из нескольких частей для использования в качестве списка массивов

List<MultipartBody.Part> descriptionList = new ArrayList<>();
descriptionList.add(MultipartBody.Part.createFormData("param_name_here", values));

Ниже приведены функции в сервисном интерфейсе модернизации.

@PUT("/")
@Multipart
Call<ResponseBody> uploadPhotos(
        @Part MultipartBody.Part placeId,
        @Part MultipartBody.Part name,
        @Part List<MultipartBody.Part> desclist, // <-- use such for list of same parameter
        @Part List<MultipartBody.Part> files  // <-- multiple photos here
);

Надеюсь, это кому-то поможет. ваше здоровье... !!!

person Siddhesh Shirodkar    schedule 18.11.2018
comment
Он работал для передачи списка String через Multipart. Спасибо @Siddher - person RamaKrishnan; 10.06.2019
comment
Ой, мужики! большое спасибо - person Nik; 30.12.2020
comment
Сэкономил много времени, спасибо за решение! - person hetsgandhi; 05.01.2021

Просто используйте @Part ("items []") Элементы списка

Нравится:

List<String> items = new ArrayList();
    items.add("1");
    items.add("2");
    items.add("3");

@Multipart
@POST("/")
Call<Result> yourMethod(@PartMap() Map<String, RequestBody> partMap, @PartMap() Map<String, RequestBody> map, @Part MultipartBody.Part file, @Part("items[]") List<String> items);
person ODAXY    schedule 16.11.2016
comment
как разобрать этот массив в php ?? - person bipin; 30.03.2017

это возможно, и это тоже с использованием multiparts, просто преобразуйте свой массив в Json String и добавьте его как одну часть, и как только этот Json будет получен на стороне сервера, просто десериализуйте его.

person Jay Dangar    schedule 04.01.2019