使用Retrofit 2

时间:2017-01-11 12:02:27

标签: android retrofit retrofit2

我正在寻找通过改造2在 GET 请求中添加int数组(例如[0,1,3,5])作为参数的方法。然后,生成的url应该是这样的:http://server/service?array=[0,1,3,5]

怎么做?

7 个答案:

答案 0 :(得分:9)

只需将其添加为查询参数

即可
@GET("http://server/service")
Observable<Void> getSomething(@Query("array") List<Integer> array);

你也可以使用int []或Integer ...作为最后一个参数;

答案 1 :(得分:3)

我最终通过使用Arrays.toString(int [])方法并通过删除此结果中的空格来创建解决方案,因为Arrays.toString返回“[0,1,3,5]”。我的请求方法看起来像这样

@GET("http://server/service")
Observable<Void> getSomething(@Query("array") String array);

答案 2 :(得分:1)

我遇到了类似的问题,必须做几件事才能达到可接受的形式(如问题中所述)。

  1. 将ArrayList转换为字符串

    arrayList.toString().replace(" ", "")
    
  2. 在RetroFit方法中,我将接受上面ArrayList的查询参数更改为:

    @Query(value = "cities", encoded = true)
    

这可确保括号和逗号未经过URL编码。

答案 3 :(得分:0)

使用toString对我不起作用。 相反,TextUtils.join(",", ids)可以解决问题。

别忘了用Query标记encoded = true

答案 4 :(得分:0)

您需要使用如下数组语法来命名查询参数:

@GET("http://server/service")
Observable<Void> getSomething(@Query("array[]") List<Integer> array);

语法本身将因所使用的后端技术而异,但是不包括方括号“ []”通常将被解释为单个值。

例如,使用array=1&array=2通常会被后端解释为仅array=1array=2而不是array=[1,2]

答案 5 :(得分:0)

这对我有用了

第1步:

StateServce.kt

@GET("states/v1")
fun getStatesByCoordinates(@Query("coordinates", encoded = true) coordinates: String) : Call<ApiResponse<List<State>>>

第2步

从存储库调用时

val mCoordinate : List<Double> = [22.333, 22.22]
mStateService?.getStatesByCoordinates(mCoordinate.toString().replace(" ", ""))!!

答案 6 :(得分:0)

使用Iterable封装整数列表,或使用二维整数数组。

  • 如何定义:

    public interface ServerService {
        @GET("service")
        Call<Result> method1(@Query("array") Iterable<List<Integer>> array);
    
        @GET("service")
        Call<Result> method2(@Query("array") Integer[][] array);
    }
    
  • 使用方法:

    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.
    

有关解决问题的方法,请参考Retrofit2的代码ParameterHandler.java