我正在寻找通过改造2在 GET 请求中添加int数组(例如[0,1,3,5])作为参数的方法。然后,生成的url应该是这样的:http://server/service?array=[0,1,3,5]
怎么做?
答案 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)
我遇到了类似的问题,必须做几件事才能达到可接受的形式(如问题中所述)。
将ArrayList转换为字符串
arrayList.toString().replace(" ", "")
在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=1
或array=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。