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
相关产品推荐
相关产品推荐

