一尘不染

在Android上解析查询字符串

java android

Java EE具有ServletRequest.getParameterValues()。

在非EE平台上,URL.getQuery()仅返回一个字符串。

当不在 Java EE上时,正常解析URL中的查询字符串的正常方法是什么?

< rant >

尝试创建自己的解析器的答案很流行。这是一个非常有趣且令人兴奋的微编码项目,但我不能说这是一个好主意 :(

以下代码片段通常有缺陷或损坏,顺便说一句。打破它们对于读者来说是一个有趣的练习。 并向黑客攻击使用它们的网站。

解析查询字符串是一个定义明确的问题,但阅读规范和理解细微差别并非易事。最好让一些平台库编码器为您完成工作,并进行修复!

< / rant >


阅读 464

收藏
2020-03-05

共1个答案

一尘不染

由于Android M,事情变得更加复杂。android.net.URI .getQueryParameter()的答案有一个错误,该错误在JellyBean之前打乱了空格。 阿帕奇URLEncodedUtils.parse()工作,但以L弃用,并以M删除。

因此,最好的答案是UrlQuerySanitizer。自API级别1起就存在,并且仍然存在。它还使你考虑棘手的问题,例如如何处理特殊字符或重复值。

最简单的代码是

UrlQuerySanitizer.ValueSanitizer sanitizer = UrlQuerySanitizer.getAllButNullLegal();
// remember to decide if you want the first or last parameter with the same name
// If you want the first call setPreferFirstRepeatedParameter(true);
sanitizer.parseUrl(url);
String value = sanitizer.getValue("paramname"); // get your value
2020-03-05