如何配置Square的Retrofit Client来处理具有可变数量参数的请求

时间:2013-07-10 20:13:47

标签: java android networking retrofit

我正在构建一个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?像这样:

@GET("/library.php")
void library(
        Map<String,Object> parameters,
        Callback<Map<String,Object>> callback
);

service.library(parameters, callback);

提前感谢任何提示。

编辑:为与请求无关的参数传递null,在这种情况下不起作用。理想情况下,我可以根据参数字典设置/创建@Query,这样如果键值为null,键就不会成为@Query

编辑:我特意寻找适用于GET请求的解决方案。

2 个答案:

答案 0 :(得分:3)

您总是可以尝试将参数作为HTTP Body传递,例如在this example中(注意:我是作者)

但正如您所建议的那样,请使用带有您的值的地图,这样这可能对您有用:

@POST("/library.php")
public void library(@Body Map<String, Object> parameters, Callback<Map<String,Object>> callback);

答案 1 :(得分:3)

有点晚了,但我会发布它,以防有人在Google上发现同样的问题。

他们引入了Annotation @QueryMap

这个注释让你传递和实现Map类的对象,不像Post请求那样让你传递一个Object作为参数,但是它完成了工作。

@GET("/library.php")
public void library(@QueryMap Map<String, Object> parameters, Callback<Map<String,Object>> callback);