在安卓设备上解析查询字符串

2022-08-31 05:19:42

Java EE 有 ServletRequest.getParameterValues().

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

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


在答案中,尝试制作自己的解析器很受欢迎。这是一个非常有趣和令人兴奋的微编码项目,但我不能说这是一个好主意

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

分析查询字符串是一个定义明确的问题,但阅读规范并了解细微差别并非易事。让一些平台库编码人员为您做艰苦的工作并进行修复要好得多!


答案 1

在安卓设备上:

import android.net.Uri;

[...]

Uri uri=Uri.parse(url_string);
uri.getQueryParameter("para1");

答案 2

自从Android M以来,事情变得更加复杂。android.net.URI.getQueryParameter() 的答案有一个错误,它在JellyBean之前会破坏空格。Apache 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");

如果您对默认解析行为感到满意,可以执行以下操作:

new UrlQuerySanitizer(url).getValue("paramName")

但你应该确保你了解默认的解析行为是什么,因为它可能不是你想要的。