将 @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 架构,您可以调用相关存储库中的格式化代码。
我正在使用 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 架构,您可以调用相关存储库中的格式化代码。