Android Retrofit2 可选 @Path 参数

Raf*_*nka 4 android retrofit2

在我的 andorid 应用程序中,我使用 Retrofit2 发出 GET 请求:

http://myapi.com/items/list
Run Code Online (Sandbox Code Playgroud)

但我还想提出另一个要求,例如

http://myapi.com/items/list/filter/active:true,min_price:100
Run Code Online (Sandbox Code Playgroud)

所以过滤器参数是可选的。我正在尝试执行以下操作:

@GET("items/items/list{filter}")
Observable<ResponseItems> getItems(@Path("filter") String filter);
Run Code Online (Sandbox Code Playgroud)

并称之为:

service.getItems("")
Run Code Online (Sandbox Code Playgroud)

和:

service.getItems("/filter/active:true,min_price:100")
Run Code Online (Sandbox Code Playgroud)

但它不起作用。所以我最终创建了两个单独的服务调用,一个带有过滤器参数,另一个没有。我认为应该有更优雅的方法。

Bel*_*loo 5

所以我已经看到了你想要实现的目标。

您的 api 声明应如下所示:

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

一个电话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被调用。

注释中的encoded属性@Path已设置,因为您的可选路径参数包含/并在没有该属性的情况下对其进行改造编码。

因此,正如我在评论中所写,最好使用两个声明:

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

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

所以你可以称之为 service.getItems("active:true,min_price:100")