Я должен сделать POST-запрос, чтобы отправить переменные числа ArrayList на сервер.
Вот пример того, как может выглядеть полезная нагрузка
parameter_1 : [1,2,3]
parameter_2 : ["one", "two", "three"]
имена параметров и их количество заранее неизвестны.
Я создал тестовый пример, используя следующий метод
@FormUrlEncoded
@POST(register)
Call<TestApiResponse> TestApiCall(
@Field("parameter_1[]") ArrayList<Integer> parameterOne,
@Field("parameter_2[]") ArrayList<String> parameterTwo
);
и я назвал эту функцию так:
ArrayList<String> param1 = new ArrayList<Integer>();
param1.add(1); param1.add(2); param1.add(3);
ArrayList<String> param2 = new ArrayList<String>();
param2.add("one"); param2.add("two");
и затем я перехватил вызов API для модификации. Я вижу, что значения кодируются как параметр_1% 5B% 5D, параметр_1% 5B% 5D, параметр_1% 5B% 5D и параметр_2% 5B% 5D, параметр_2% 5B% 5D, соответственно для обоих параметров.
Теперь следующим шагом для меня будет посмотреть, смогу ли я сделать тот же вызов API, но вместо того, чтобы жестко кодировать имена параметров в декларации интерфейса Retrofit, делать это динамически.
Я делал это раньше для переменного количества параметров для отправки значений String с использованием FieldMap.
Но когда я создаю такую функцию:
@FormUrlEncoded
@POST(register)
Call<LoginResponse> registerUserWithoutAvatar2(
@FieldMap Map<String, ArrayList<String>> arrayParameters,
);
Я вызываю эту функцию следующим образом
Map<String, ArrayList<String>> param = new HashMap<>();
ArrayList<String> param1 = new ArrayList<String>();
param1.add(1); param1.add(2); param1.add(3);
param.put("parameter_1[]", param1)
когда я перехватываю вызов API, я вижу, что Retrofit закодировал поле как один параметр param_1% 5B% 5D, а его значение представляет собой закодированную строку, разделенную запятыми, которая выглядит как 1% 2C2% 2C3.
Любая подсказка, как я мог это исправить? или если есть альтернативный подход? Рады предоставить больше информации.