我正在寻找解析 URL 以获取 Java 中查询字符串参数的集合。需要明确的是,我需要解析给定的 URL(或 URL 对象的字符串值),而不是来自 servlet 请求的 URL。
看起来该javax.servlet.http.HttpUtils.parseQueryString
方法似乎是显而易见的选择,但它已被弃用。
是否有我遗漏的替代方法,或者它只是在没有等效替换/增强功能的情况下被弃用?
我正在寻找解析 URL 以获取 Java 中查询字符串参数的集合。需要明确的是,我需要解析给定的 URL(或 URL 对象的字符串值),而不是来自 servlet 请求的 URL。
看起来该javax.servlet.http.HttpUtils.parseQueryString
方法似乎是显而易见的选择,但它已被弃用。
是否有我遗漏的替代方法,或者它只是在没有等效替换/增强功能的情况下被弃用?
我认为这个想法是改用 HttpServletRequest 。有 getParameterMap()、getParameterNames() 和 getParameterValues() 方法可以启动。
还有 getParameter(String paramname) 方法来获取特定方法的值。
这些在查询字符串参数和表单参数之间没有区别,因此,如果您的意图是特别查找查询字符串,那么我想这将无济于事。
好吧,正如您提到的 URL 不是来自 servlet 请求,正确的答案是,像往常一样,它取决于.
url 的查询部分的问题是没有关于如何处理参数重复的明确规范。
例如,考虑这样一个 url:
http://www.example.com?param1=value1¶m2=value2¶m1=value3
您期望 param1 的值是多少?第一个值,最后一个值,一个数组?问题是,根据规范,所有这些答案都是有效的,服务器供应商可以自由地支持其中一个或另一个。有些人使用 param1[] 表示法来表示它必须被视为一个数组,但同样,这不是一个统一的解决方案。
因此,“最佳”解决方案是了解您的目的地如何处理参数,并使用自制的实用程序类来模仿行为。
据我所知,没有。
不过自己写一个应该不会太难。我想,最难的部分是解码 URL 名称/值(如果你仔细想想,这真的不难),你可以使用java.net.URLDecoder#decodeURL(String,String)
它。
对于所有 Kotlin 爱好者,我想出了这个:
fun splitQuery(url: URL): Map<String, List<String?>> = url.query?.let {
it.split("&").map {
it.split("=").let {
Pair(it[0], it.getOrNull(1))
}
}.groupBy({ it.first }, {
it.second
})
} ?: emptyMap()