我希望解析一个URL以获取Java中的查询字符串参数的集合。为了清楚起见,我需要解析给定的URL(或URL对象的字符串值),而不是来自servlet请求的URL。
看起来好像javax.servlet.http.HttpUtils.parseQueryString
方法是明显的选择,但它已被弃用。
是否有一种我缺少的替代方法,或者只是在没有等效替换/增强功能的情况下弃用它?
答案 0 :(得分:5)
我认为这个想法是使用HttpServletRequest代替。有getParameterMap(),getParameterNames()和getParameterValues()方法可以启动。
还有getParameter(String paramname)方法来获取特定方法的值。
这些在查询字符串参数和表单参数之间没有区别,尽管如此,如果你的目的是寻找特定的查询字符串,那么我想这无济于事。
答案 1 :(得分:2)
好吧,正如您所提到的,URL并非来自servlet请求,正确答案是取决于。
url的查询部分的问题在于没有关于如何处理参数重复的明确规范。
例如,考虑一下这样的网址:
http://www.example.com?param1=value1¶m2=value2¶m1=value3
您对param1的价值有何看法?第一个值,最后一个,一个数组?问题是,根据规范,所有这些答案都是有效的,服务器供应商可以自由支持其中一个或另一个。有些人使用param1 []符号表示必须将其视为数组,但同样,这不是一个统一的解决方案。
因此,“最佳”解决方案是了解目标如何处理参数,并使用自制的实用程序类模仿行为。
答案 2 :(得分:2)
答案 3 :(得分:0)
据我所知,没有一个。
虽然自己写一个不应该太难。我想,最困难的部分是解码URL名称/值(如果你考虑的话,这真的不是那么难),你可以使用java.net.URLDecoder#decodeURL(String,String)
。
答案 4 :(得分:0)
对于所有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()