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

Java中不解析URL获取查询参数详情报错求助

URL查询参数处理触发URISyntaxException错误

我想从URL中提取查询参数的名称和值,但有个限制:不能通过解析URL的方式获取这些信息。我尝试先找到?的索引再截取子串处理查询参数,用了这段代码:

String query = uri.getQuery() == null || uri.getQuery().trim().isEmpty() ? "" : uri.getQuery();

结果触发了错误:

java.net.URISyntaxException: Illegal character in query at index

我用的URL是:

https://xyzz.com.in/collections/two-tone-wedding-rings?ugg_9ty554_tags=ROSE|WHITE&ugg_yuiolz_price=%3A700%201000%20%7B0%7D%20-%20%7B1%7D

(其中|符号是问题根源)

请问我哪里错了?


你的问题出在用URI.getQuery()本身就属于解析URL的操作,而URI类对查询参数里的非法字符(比如|,它属于未编码的保留字符)会严格校验,直接调用getQuery()会触发语法异常,这也和你“不能解析URL”的限制冲突了。

按照你的思路,应该直接把URL当作普通字符串处理,跳过URI/URL类的解析步骤:

  1. 把整个URL作为字符串,找到?的索引位置
  2. 如果存在?,就截取?之后的子串作为查询参数部分
  3. 再对这个子串进行分割处理(按&分割键值对,再按=分割名称和值)

示例代码:

String urlStr = "https://xyzz.com.in/collections/two-tone-wedding-rings?ugg_9ty554_tags=ROSE|WHITE&ugg_yuiolz_price=%3A700%201000%20%7B0%7D%20-%20%7B1%7D";
String query = "";
int queryStartIndex = urlStr.indexOf('?');
if (queryStartIndex != -1 && queryStartIndex < urlStr.length() - 1) {
    query = urlStr.substring(queryStartIndex + 1);
}
// 后续处理query,分割键值对
if (!query.isEmpty()) {
    String[] paramPairs = query.split("&");
    for (String pair : paramPairs) {
        String[] keyValue = pair.split("=", 2);
        String key = keyValue[0];
        String value = keyValue.length > 1 ? keyValue[1] : "";
        // 如需解码URL编码字符,可调用下方方法(无需解析整个URL)
        // value = java.net.URLDecoder.decode(value, java.nio.charset.StandardCharsets.UTF_8);
        System.out.println("参数名:" + key + ",参数值:" + value);
    }
}

注意:如果需要处理URL编码的字符(比如%3A对应:,%20对应空格),可以用URLDecoder.decode()方法,这一步只是对字符串做解码处理,并不涉及URL解析,符合你的限制。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 16:27:37