在我的 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)
但它不起作用。所以我最终创建了两个单独的服务调用,一个带有过滤器参数,另一个没有。我认为应该有更优雅的方法。
所以我已经看到了你想要实现的目标。
您的 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")
| 归档时间: |
|
| 查看次数: |
4625 次 |
| 最近记录: |