Add an array as request parameter with Retrofit 2

后端 未结 7 710
故里飘歌
故里飘歌 2020-12-10 11:04

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:/

相关标签:
7条回答
  • 2020-12-10 11:38

    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);
    
    0 讨论(0)
  • 2020-12-10 11:41

    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;

    0 讨论(0)
  • 2020-12-10 11:43

    Using toString didn't work for me. Instead, TextUtils.join(",", ids) does the trick.

    Don't forget to mark the Query with encoded = true.

    0 讨论(0)
  • 2020-12-10 11:45

    I faced a similar problem and had to do a couple of things to reach the acceptable form (as asked in the question).

    1. Converted an ArrayList to String

      arrayList.toString().replace(" ", "")
      
    2. 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.

    0 讨论(0)
  • 2020-12-10 11:54

    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.

    0 讨论(0)
  • 2020-12-10 11:59

    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].

    0 讨论(0)
提交回复
热议问题