如何向Retrofit动态传递HTTP请求方法类型并解决参数匹配报错问题
错误原因
@Path注解的作用是替换@HTTP注解中path参数里的占位符,你给@HTTP的path参数填的值是"{url}",里面没有{method}占位符,却用@Path("method")声明了要替换method占位符,自然匹配失败抛出异常。- 同时你还同时声明了
@Url参数和path里的{url}占位符,二者功能冲突,@Url会直接覆盖path的配置,不需要在path里写url相关占位符。
修复方案
直接修改接口注解代码即可,修改后逻辑满足Retrofit的校验规则,同时保留动态适配请求方法、动态传入请求地址的能力:
// path里增加{method}占位符匹配@Path注解,hasBody设为true兼容POST/PUT等带请求体的请求 @HTTP(method = "{method}", path = "{method}", hasBody = true) fun callAPIs( @Path(value = "method") httpMethod: String, @Header("Authorization") auth: String, @Header("app-version") app_version: String, @Body data: JsonObject, @Url url: String ): Call<JsonElement>
注意事项
- 如果调用GET、HEAD这类不允许携带请求体的方法,需要把
@Body参数改成可选类型,或者调用时传空的JsonObject,避免抛出请求方法不支持body的异常。
内容的提问来源于stack exchange,提问作者primo
相关产品推荐
相关产品推荐

