如何配置 Square 的 Retrofit Client 以处理具有可变数量参数的请求
Posted
技术标签:
【中文标题】如何配置 Square 的 Retrofit Client 以处理具有可变数量参数的请求【英文标题】:How can I configure Square's Retrofit Client to handle a request with a variable number of parameters 【发布时间】:2013-07-08 22:32:04 【问题描述】:我正在构建一个 android 应用程序,并且正在使用 Square 的 Retrofit 库进行短期网络调用。我对 Java 和 Android 比较陌生。到目前为止,我已经构建了这样的请求:
@GET("/library.php")
void library(
@Query("one_thing") String oneThing,
@Query("another_thing") String anotherThing,
Callback<Map<String,Object>> callback
);
然后这样称呼他们:
service.library(oneThing, anotherThing, callback);
我需要实现一个接受可变数量参数的请求,不超过 10 个左右。必须单独定义它们并传递null
或对于给定请求不存在的那些是很麻烦的。有没有办法为请求定义一个接口,以便它接受变量编号或参数并为参数字典/映射中的每个元素自动构造@Query
s?像这样的:
@GET("/library.php")
void library(
Map<String,Object> parameters,
Callback<Map<String,Object>> callback
);
service.library(parameters, callback);
提前感谢您的任何提示。
编辑:为与请求无关的参数传递 null 在这种情况下将不起作用。理想情况下,我可以根据参数字典设置/创建@Query
s,这样如果键的值为空,则键不会变为@Query
。
编辑:我正在专门寻找一种适用于 GET 请求的解决方案。
【问题讨论】:
【参考方案1】:您总是可以尝试将参数作为 HTTP 正文传递,例如在 this example 中(注意:我是作者)
但正如您所建议的,请改用带有您的值的 Map,因此这可能对您有用:
@POST("/library.php")
public void library(@Body Map<String, Object> parameters, Callback<Map<String,Object>> callback);
【讨论】:
谢谢!您的示例说明这仅适用于 POST 而不是 GET,对吗?如果是这样,GET 是否有类似的解决方案? (稍后测试...) 是的,看起来这对于 GET 是不可能的。 是的,不幸的是,这是 HTTP 的限制。 RequestBody 仅在 Post/Put 上发送,而不是 Get【参考方案2】:有点晚了,但我还是会发布它,以防有人在 Google 上发现同样的问题。
他们引入了注解@QueryMap
这个注解让你传递一个实现 Map 类的对象,不如 Post 请求让你传递一个对象作为参数但它完成了工作。
@GET("/library.php")
public void library(@QueryMap Map<String, Object> parameters, Callback<Map<String,Object>> callback);
【讨论】:
以上是关于如何配置 Square 的 Retrofit Client 以处理具有可变数量参数的请求的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法设置一个基本请求参数以包含在使用 Square 的 Retrofit 库发出的每个请求中?
spring-cloud-square源码速读(retrofit + okhttp篇)