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

Pab*_*blo 3 android retrofit2

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

@POST
Call<LoginResponse> login(@Url String url, @Body LoginRequest user);
Run Code Online (Sandbox Code Playgroud)

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

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

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

这是例外:

java.lang.IllegalArgumentException: @Path parameters may not be used with @Url. (parameter #4)
Run Code Online (Sandbox Code Playgroud)

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

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

提前致谢。

小智 6

如《Retrofit 2 - 动态 URL》一文中所述,该@Url表示法假定 String 是完全定义的 URL,并且不检查它是否包含@Path变量。

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