我正在使用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
注释?
提前致谢。
答案 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 架构,您可以调用相关存储库中的格式化代码。