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

Using @Path and @Url paramers together with 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 参数,并在调用中仅使用 @Url 参数。但我认为这不是最好的方法,因为我将使用 @Path 参数对所有操作执行此操作。

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

提前致谢。

如post 中所述,@Url表示法假定String是一个完全定义的URL并且不检查它是否包含@Path变量。

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

有一个解决方法。如果动态 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)

并在retrofit界面中,在函数中使用@Url参数。

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

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