You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Retrofit 2.0中如何正确在URL传入变量?报错求助

解决Retrofit中URL Query参数替换块的错误

这个错误的核心原因很明确:Retrofit不允许在URL的查询字符串(?之后的部分)中使用路径参数替换块({id}这种格式)。路径参数只能用于URL的路径部分(比如/files/upload/{id}),而动态的查询参数必须通过@Query注解来传递。

针对你的需求(构建/files/upload?dir=userIcons/{id}格式的请求),有两种简洁的修复方式:

方法一:传递完整的dir参数值

直接通过@Query传递包含前缀和id的完整dir参数,这样最贴合你的需求:

@Headers("Content-type: multipart/form-data")
@POST("/files/upload")
fun upload(@Query("dir", encoded = true) dir: String, @Body encodedImg: String): Call<IconModel>

调用这个方法时,把dir参数拼接成"userIcons/你的id值"即可:

upload("userIcons/12345", encodedImg)

方法二:让后端处理前缀拼接(可选)

如果后端支持调整逻辑,你也可以只传递id作为单独的查询参数,让服务端负责拼接userIcons/前缀:

@Headers("Content-type: multipart/form-data")
@POST("/files/upload")
fun upload(@Query("id", encoded = true) id: String, @Body encodedImg: String): Call<IconModel>

为什么原来的写法会报错?

你之前的代码在@POST的URL里写了dir=userIcons/{id},Retrofit会把{id}识别为路径参数,但路径参数只能出现在URL的路径段(?之前),查询字符串里的动态值必须通过@Query来绑定,这就是触发IllegalArgumentException的根本原因。

内容的提问来源于stack exchange,提问作者Nikita Vasko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:19:28