10

我正在寻找解析 URL 以获取 Java 中查询字符串参数的集合。需要明确的是,我需要解析给定的 URL(或 URL 对象的字符串值),而不是来自 servlet 请求的 URL。

看起来该javax.servlet.http.HttpUtils.parseQueryString方法似乎是显而易见的选择,但它已被弃用。

是否有我遗漏的替代方法,或者它只是在没有等效替换/增强功能的情况下被弃用?

4

5 回答 5

5

我认为这个想法是改用 HttpServletRequest 。有 getParameterMap()、getParameterNames() 和 getParameterValues() 方法可以启动。

还有 getParameter(String paramname) 方法来获取特定方法的值。

这些在查询字符串参数和表单参数之间没有区别,因此,如果您的意图是特别查找查询字符串,那么我想这将无济于事。

于 2008-10-30T01:01:28.780 回答
3

好吧,正如您提到的 URL 不是来自 servlet 请求,正确的答案是,像往常一样,它取决于.

url 的查询部分的问题是没有关于如何处理参数重复的明确规范。

例如,考虑这样一个 url:

http://www.example.com?param1=value1&param2=value2&param1=value3

您期望 param1 的值是多少?第一个值,最后一个值,一个数组?问题是,根据规范,所有这些答案都是有效的,服务器供应商可以自由地支持其中一个或另一个。有些人使用 param1[] 表示法来表示它必须被视为一个数组,但同样,这不是一个统一的解决方案。

因此,“最佳”解决方案是了解您的目的地如何处理参数,并使用自制的实用程序类来模仿行为。

于 2008-10-30T10:47:52.543 回答
3

使用org.apache.http.client.utils.URLEncodedUtils.html#parse(org.apache.http.HttpEntity)

于 2011-05-12T02:58:11.210 回答
0

据我所知,没有。

不过自己写一个应该不会太难。我想,最难的部分是解码 URL 名称/值(如果你仔细想想,这真的不难),你可以使用java.net.URLDecoder#decodeURL(String,String)它。

于 2008-10-30T10:44:45.577 回答
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()
于 2019-12-02T14:07:23.883 回答