将@Path和@Url参数与retrofit2一起使用

时间:2016-04-26 21:40:47

标签: android retrofit2

我正在使用retrofit2与webapi进行通信。 我需要动态地设置webapi的URL,用户可以更改它,所以我使用@Url注释来指定它:

@POST
Call<LoginResponse> login(@Url String url, @Body LoginRequest user);

在其中一个操作中,我需要向服务器发送一些路径参数,所以我这样做:

@GET
Call<DataResponse> getOrder(@Url String url,
                             @Header(WEBAPI_EMAIL_HEDER) String email,
                             @Header(WEBAPI_TOKEN_ID_HEDER) String token,
                             @Path("id") int id);

当我调用操作getOrder(...)时,retrofit会引发异常,因为我不希望在同一操作中使用@Url@Path参数。

这是一个例外:

java.lang.IllegalArgumentException: @Path parameters may not be used with @Url. (parameter #4)

一种解决方案是替换url上的id参数,并在invokation中仅使用@Url参数。但我认为这不是最好的方法,因为我将使用@Path参数进行所有操作。

还有其他更清洁的解决方案吗?也许使用另一个retrofit2注释?

提前致谢。

2 个答案:

答案 0 :(得分:3)

如帖子Retrofit 2 - Dynamic URL中所述,@Url表示法假定字符串是完全定义的URL,但不检查它是否包含@Path个变量。

要使用@Path注释,您必须配置端点网址并在@Path注释中包含@GET()变量。

答案 1 :(得分:0)

有一个解决方法。如果是带有一些可变路径的动态 Url,我们可以定义一个字符串格式,其路径由 %s 参数表示。 例如: 假设带有路径的动态 url 是:https://www.example.com/users/{id}/whoami

这里我们可以将 {id} 替换为 %s。所以现在变成了,

val formatString = https://www.example.com/users/%s/whoami

现在我们可以将其用作格式字符串并将其替换为所需的 id。

val url = formatString.format(id)

在改造界面中,在函数中使用@Url参数。

    interface AnyService {
      fun whoAmI(@Url url:String): Call<ResponseBody>
    }

如果您使用的是 MVVM 架构,您可以调用相关存储库中的格式化代码。