URLEncodedUtils.parse解析重定向URI出错,首个条目为URL本身
问题原因
你误用了URLEncodedUtils.parse()的参数——这个方法的第一个参数是表单编码的查询参数字符串(即URL中?之后的部分),而非完整URL。直接传入完整URL时,它会把整个字符串按=分割解析,自然会出现将https://my.redirect.de/foo?code当作参数名的错误结果。
解决方法
方法1:手动提取查询字符串后解析
先拆分完整URL,提取?之后的查询部分再传入方法:
String redirectedTo = "https://my.redirect.de/foo?code=123&state=123"; int queryIndex = redirectedTo.indexOf('?'); List<NameValuePair> params = Collections.emptyList(); if (queryIndex != -1) { String queryStr = redirectedTo.substring(queryIndex + 1); params = URLEncodedUtils.parse(queryStr, Charset.defaultCharset()); }
方法2:用URIBuilder解析完整URL(推荐)
借助Apache HttpClient的URIBuilder可以更稳妥地处理完整URL,自动识别查询参数,还能兼容无参数的URL场景:
URI uri = new URIBuilder("https://my.redirect.de/foo?code=123&state=123").build(); // 方式1:结合URLEncodedUtils解析 List<NameValuePair> params = URLEncodedUtils.parse(uri, Charset.defaultCharset().name()); // 方式2:直接从URIBuilder获取参数 List<NameValuePair> params = new URIBuilder(uri).getQueryParams();
补充说明
URLEncodedUtils的设计定位是解析application/x-www-form-urlencoded格式的字符串(比如POST表单数据、URL查询串),而非完整URL。使用URIBuilder能避免手动拆分URL时可能出现的边缘问题(比如URL中包含多个?、特殊字符编码等),是更可靠的方案。
内容的提问来源于stack exchange,提问作者Julian
相关产品推荐
相关产品推荐

