【问题标题】:Retrofit GET request with arrays in Query params使用查询参数中的数组改造 GET 请求
【发布时间】:2021-08-28 22:46:28
【问题描述】:

如何使用这样的查询参数发送 GET 请求? key1=["S","I","D"]&key2=[["A","X",0],["X","Y","Z"]]

【问题讨论】:

    标签: android rest retrofit2


    【解决方案1】:

    根据retrofit java documents,你可以这样做。

    使用 Retrofit.stringConverter(Type, Annotation[]) (或 Object.toString(),如果没有安装匹配的字符串转换器)将值转换为字符串,然后进行 URL 编码。空值被忽略。传递 List 或数组将为每个非空项生成一个查询参数。

    Array/Varargs Example:
    
    
     @GET("/friends")
     Call<ResponseBody> friends(@Query("group") String... groups);
     
     Calling with foo.friends("coworker", "bowling") yields /friends??> group=coworker&group=bowling.
    

    所以你可以做这样的事情

    @GET("/something")
    Call<ResponseBody> getSomething(@Query("key1") String[] key1, 
    Query("key2") String[] key2 );
    
    foo.getSomething(key1, key2) 
    

    更新 - 以上是查询具有多个值的参数的标准方法

    为了将数组作为字符串发送,你可以像下面那样做

    默认情况下,参数名称和值是 URL 编码的。指定 encoded=true 以更改此行为。

    @GET("/something")
     Call<ResponseBody> getSomething(@Query(value="key1", encoded=true) String key1);
    
    
    
    Calling with foo.getSomething("['S','I','D']")) yields /something?key1=['S','I','D'].
    

    【讨论】:

    • 以这种方式尝试过,它在发送请求时返回带有键名的每个值。不作为字符串数组传递
    【解决方案2】:

    由于改造无法识别您的自定义数组类型,您必须考虑参数类型String,然后在传递给改造方法之前构建您的参数,如"["S","I","D"]"。

    例如创建你的参数:

    String parameter = "["
    int arraySize = array.size()
    
    for(int i = 0; i < arraySize; i++) {
       parameter += "\"" + array.get(i) + "\"";
       if(i != arraySize - 1) {//Append ',' except last element
          parameter += ",";
       }
    }
    parameter += "]";
    
    

    具有“S”、“I”和“D”元素的数组的输出是["S","I","D"] String。 现在您可以将其作为改造参数传递。

    【讨论】:

    • 我尝试创建 arraylist 来添加元素并将其转换为 String 以传递,但它没有给我想要的格式。
    • 你必须创建你的自定义格式,检查更新的答案。
    猜你喜欢
    • 1970-01-01
    • 2020-06-14
    • 1970-01-01
    • 2015-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-27
    • 1970-01-01
    相关资源
    最近更新 更多