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

Retrofit GET请求含特殊字符的查询参数调用方法咨询

Retrofit中处理带特殊字符的查询参数问题

问题根源

你遇到的报错是因为**错误地将查询参数(URL中?后的参数)当作了路径参数(URL路径里的占位符)**使用。Retrofit的@Path注解对参数名有严格规则,只允许字母开头,后跟字母、数字、下划线或连字符,显然metadata.tags.sys.id不符合这个要求。

正确解决方案

你的参数metadata.tags.sys.id[in]属于查询参数,应该用以下方式处理:

1. 单个参数直接用@Query

把完整的参数名作为@Query的value传入,变量名可以用合法的名称代替:

@GET("your/api/resource/path")
Call<YourResponseBody> fetchResources(
    // 括号内是真实的参数名,变量名可以自定义
    @Query("metadata.tags.sys.id[in]") String targetTagId
);

调用时直接传入参数值即可,Retrofit会自动处理特殊字符的URL编码。

2. 多个特殊参数用@QueryMap

如果有多个带特殊字符的查询参数,用Map来统一管理更高效:

@GET("your/api/resource/path")
Call<YourResponseBody> fetchResources(
    @QueryMap Map<String, String> queryParams
);

调用时构建参数Map:

Map<String, String> params = new HashMap<>();
params.put("metadata.tags.sys.id[in]", "your_target_id");
// 可添加其他参数
params.put("another.param[like]", "value");

yourApiService.fetchResources(params);

特殊情况:如果是路径中的特殊部分

如果这个带点的字段确实是URL路径的一部分(比如/api/{metadata.tags.sys.id}/data),Retrofit的@Path不支持这种命名,此时可以用@Url动态拼接完整URL:

@GET
Call<YourResponseBody> fetchResources(@Url String fullEncodedUrl);

需要自己提前拼接好包含特殊路径的URL,并确保完成正确的URL编码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 00:27:13