Как отправить массивы/списки с доработкой

Мне нужно отправить список/массив значений Integer с Retrofit на сервер (через POST) Я делаю это так:

@FormUrlEncoded
@POST("/profile/searchProfile")
Call<ResponseBody> postSearchProfile(
        @Field("age") List<Integer> age
};

и отправить его следующим образом:

ArrayList<Integer> ages = new ArrayList<>();
        ages.add(20);
        ages.add(30);

ISearchProfilePost iSearchProfile = gsonServerAPIRetrofit.create(ISearchProfilePost.class);
        Call<ResponseBody> call = iSearchProfile.postSearchProfile(
                ages
        );

Проблема заключается в том, что значения достигают сервера, не разделенного запятыми. Значения там как возраст: 2030, а не возраст: 20, 30.

Я читал (например, здесь qaru.site/info/839083/...), что некоторые успели записать параметр с помощью [] как массив, но это приводит только к параметрам, называемым age []: 2030. Я также пытался использовать массивы, а также списки со строками. Та же проблема. Все происходит непосредственно в одной записи.

Итак, что я могу сделать?

Ответ 1

Отправить как объект

Это ваш ISearchProfilePost.class

@FormUrlEncoded
@POST("/profile/searchProfile")
Call<ResponseBody> postSearchProfile(@Body ArrayListAge ages);

Здесь вы будете вводить данные сообщения в классе pojo

public class ArrayListAge{
    @SerializedName("age")
    @Expose
    private ArrayList<String> ages;
    public ArrayListAge(ArrayList<String> ages) {
        this.ages=ages;
    }
}

Класс переопределения вызовов

ArrayList<Integer> ages = new ArrayList<>();
        ages.add(20);
        ages.add(30);

ArrayListAge arrayListAge = new ArrayListAge(ages);
ISearchProfilePost iSearchProfile = gsonServerAPIRetrofit.create(ISearchProfilePost.class);
Call<ResponseBody> call = iSearchProfile.postSearchProfile(arrayListAge);

Чтобы отправить как список массивов, проверьте эту ссылку https://github.com/square/retrofit/issues/1064

Вы забыли добавить age[]

@FormUrlEncoded
@POST("/profile/searchProfile")
Call<ResponseBody> postSearchProfile(
    @Field("age[]") List<Integer> age
};

Ответ 2

Retrofit может сделать это сейчас, по крайней мере, я тестировал это → implementation 'com.squareup.retrofit2:retrofit:2.1.0'

Например

@FormUrlEncoded
@POST("index.php?action=item")
Call<Reply> updateStartManyItem(@Header("Authorization") String auth_token, @Field("items[]") List<Integer> items, @Field("method") String method);

Это часть, на которую мы смотрим.

@Field("items[]") List<Integer> items