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

Android中使用带特殊字符的URL调用HttpURLConnection报错如何解决?

问题根因
  • #是URL规范中的片段标识符,所有#之后的内容不会被HTTP客户端发送到服务端,会直接被截断,导致服务端收到的请求路径不完整。
  • &是URL查询参数的默认分隔符,如果参数值中直接携带&会被服务端识别为新参数的开始,打乱原有的参数结构,导致服务端无法匹配到正确的接口路径返回404。
修复方案

方案1:手动编码参数值

仅对每个查询参数的值部分做URL编码,不要编码整个URL、参数名、&、=等结构字符,编码使用UTF-8字符集:

// 示例:原拼接参数的逻辑
String paramValue = "带&和#的参数值";
// 编码参数值
String encodedValue = URLEncoder.encode(paramValue, StandardCharsets.UTF_8.name());
// 拼接完整URL
String fullUrl = "https://你的接口地址?param1=" + encodedValue + "&otherParam=xxx";
URL url = new URL(fullUrl);

方案2:使用Uri.Builder自动处理编码(Android平台推荐)

Android自带的Uri.Builder会自动对参数值做转义编码,不需要手动处理特殊字符,避免人工拼接出错:

// 构建自动编码后的URL
Uri uri = Uri.parse("https://你的基础接口地址")
        .buildUpon()
        .appendQueryParameter("param1", "带&和#的参数值")
        .appendQueryParameter("otherParam", "其他参数值")
        .build();
URL url = new URL(uri.toString());

// 后续HttpURLConnection逻辑不变
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setRequestMethod("GET");
con.setRequestProperty("Authorization", "Bearer " + accessToken);
con.setRequestProperty("UserId", "787878");
con.setReadTimeout(15000);
con.setConnectTimeout(15000);
con.setDoOutput(false);
con.connect();

InputStream inputStream;
status = con.getResponseCode();
statusmsg = con.getResponseMessage();
注意事项
  • 不要直接对完整URL做编码,会破坏URL中://、?、&等结构字符的语义,导致请求异常。
  • 编码字符集必须指定为UTF-8,避免不同系统默认字符集差异导致的乱码问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 22:09:04