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

Retrofit POST请求路径参数自动转码问题求助

Retrofit传递含JSON符号的@Path参数转码问题解决办法

最近用Retrofit发送Multipart POST请求时碰到个头疼的问题:我把包含{}、[]的JSON字符串作为@Path参数传递,结果这些符号自动被转成了%7B、%22这类URL编码格式,试了用URLDecoder解码完全没用。折腾了一番后终于找到了解决方案,分享给大家。

问题还原

我的接口定义是这样的:

@Multipart @POST("entity/api/xm-entities/self/links/targets/{link}")
Call<ResponseBody> sendPhoto( @Header("Authorization") String token, @Path("link") String link, @Part MultipartBody.Part image);

要传递的link参数是一段JSON:

{"typeKey":"typekeyName","target":{"typeKey" : "typeKeyName","name":"<filename>","tags":[{"name": "photo_name"}]}}

结果发送后参数被转成了%7B%22typeKey%22:%22typekeyName%22,%22target%22:%7B%22typeKey%22:%22typekeyNa...这种编码后的字符串,后端根本没法直接解析。

问题原因

Retrofit默认会对@Path参数做URL编码处理,这是为了符合HTTP URL的规范,但如果我们的参数本身是JSON字符串,这种自动编码就会破坏JSON结构。而你之前尝试用URLDecoder解码是没用的——因为你解码后,Retrofit在发送请求前还会再次对参数进行编码,等于白忙活一场。

解决方法

只需要给@Path注解加上encoded = true属性,告诉Retrofit:这个参数已经是处理好的,不需要再做URL编码了。

修改后的接口定义如下:

@Multipart
@POST("entity/api/xm-entities/self/links/targets/{link}")
Call<ResponseBody> sendPhoto(
    @Header("Authorization") String token,
    @Path(value = "link", encoded = true) String link,
    @Part MultipartBody.Part image
);

注意事项

  • 确保你的JSON字符串本身是合法的,没有包含需要手动URL编码的特殊字符(比如空格、中文等)。如果有这类字符,你需要自己提前做好编码,因为加上encoded = true后,Retrofit不会再帮你处理编码了。
  • 确认后端接口支持直接接收路径中的JSON字符串,有些后端框架可能会对路径参数有长度限制,这种情况下可能需要考虑把JSON参数放到请求体或者Query参数中,但如果必须用Path参数,上述方法就是最优解。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:11:09