2016-11-28 40 views
1

在我的Andorid应用程序我正在使用Retrofit2 GET请求:的Android Retrofit2可选@Path PARAM

http://myapi.com/items/list 

但我也想提出另一个请求例如

http://myapi.com/items/list/filter/active:true,min_price:100 

所以滤波器参数是可选的。我试图做到以下几点:

@GET("items/items/list{filter}") 
Observable<ResponseItems> getItems(@Path("filter") String filter); 

,把它想:

service.getItems("") 

和:

service.getItems("/filter/active:true,min_price:100") 

但它不工作。所以我最终创建了两个独立的服务调用,一个使用filter参数,另一个不使用。我认为应该有更优雅的方法。

+0

试通空,而不是空字符串。它正在查询参数。对于路径参数,您的要求有点奇怪。我认为使用单独的API调用是可以的。就像典型的带有重载方法的java类 – Beloo

+0

@Beloo是的,但是如果你的API用户使用多于一个可选路径参数,那么调用它变得非常困难并且代码真的很难看。 – RafalManka

回答

2

所以我见过你想要达到的目标。

如何你的API声明应该是这样的:

@GET("items/list/{filter}") 
Observable<ResponseItems> getItems(@Path(value = "filter", encoded = true) String filter); 

和呼叫service.getItems("")会导致http://myapi.com/items/list/被称为
呼叫service.getItems("filter/active:true,min_price:100")会导致 http://myapi.com/items/list/filter/active:true,min_price:100被调用。

@Path中的属性设置了注释,因为您的可选路径参数包含/,并且改装对其进行编码而没有该属性。

因此,正如我在评论中写道:更好地利用两个声明:

@GET("items/list/") 
Observable<ResponseItems> getItems(); 

@GET("items/list/filter/{filter}") 
Observable<ResponseItems> getItems(@Path(value = "filter") String filter); 

,所以你可以这样调用它service.getItems("active:true,min_price:100")