I\'m looking for way to add an int array (e.g [0,1,3,5]) as parameter in a GET request with retrofit 2. Then, the generated url should be like this : http:/
I have finally founded a solution by using Arrays.toString(int []) method and by removing spaces in this result because Arrays.toString return "[0, 1, 3, 5]". And my request method looks like this
@GET("http://server/service")
Observable<Void> getSomething(@Query("array") String array);
Just add it as a query param
@GET("http://server/service")
Observable<Void> getSomething(@Query("array") List<Integer> array);
You can also use int[], or Integer... as a last param;
Using toString
didn't work for me.
Instead, TextUtils.join(",", ids)
does the trick.
Don't forget to mark the Query
with encoded = true
.
I faced a similar problem and had to do a couple of things to reach the acceptable form (as asked in the question).
Converted an ArrayList to String
arrayList.toString().replace(" ", "")
In RetroFit method, I changed the Query param which accepts the ArrayList above to as follows:
@Query(value = "cities", encoded = true)
This ensures that the brackets and commas are not URL encoded.
Use Iterable to encapsulate the integer list, or use a two-dimensional integer array.
How to define:
public interface ServerService {
@GET("service")
Call<Result> method1(@Query("array") Iterable<List<Integer>> array);
@GET("service")
Call<Result> method2(@Query("array") Integer[][] array);
}
How to use:
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://server/")
.addConverterFactory(GsonConverterFactory.create())
.build();
ServerService service = retrofit.create(ServerService.class);
// Use the first method.
List<Integer> data1 = Arrays.asList(0,1,3,5);
Iterable array1 = Arrays.asList(data1);
Call<Result> method1Call = service.method1(array1);
// Use the second method.
Integer[] data2 = new Integer[]{0,1,3,5};
Integer[][] array2 = new Integer[][]{data2};
Call<Result> method2Call = service.method2(array2);
// Execute enqueue() or execute() of method1Call or method2Call.
Please refer to the code ParameterHandler.java of Retrofit2 for the reason why the way can solve the problem.
You need to name your query param with an array syntax like so:
@GET("http://server/service")
Observable<Void> getSomething(@Query("array[]") List<Integer> array);
The syntax itself will vary by the backend technology being used, however not including the brackets "[]" will normally be interpreted as a single value.
For example, using array=1&array=2
will generally be interpreted by backends as only array=1
or array=2
instead of array=[1,2]
.