【问题标题】:How to get query param as HashMap如何获取查询参数作为 HashMap
【发布时间】:2013-03-04 08:41:09
【问题描述】:

我希望能够将 GET 请求传递给我的服务器,例如:

 http://example.com/?a[foo]=1&a[bar]=15&b=3

当我得到查询参数“a”时,它应该被解析为 HashMap,如下所示:

{'foo':1, 'bar':15}

编辑:好的,要清楚,这是我想要做的,但在 Java 中,而不是 PHP:

Pass array with keys via HTTP GET

任何想法如何做到这一点?

【问题讨论】:

    标签: java jax-rs apache-wink


    【解决方案1】:

    您可以通过将 JSON 对象附加到 URL 来将其作为字符串传递。但是在此之前您需要对其进行编码,您可以使用此链接中给出的方法 http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_classes_restful_encodingUtil.htm 进行编码,然后将 json 对象附加为任何其他字符串

    【讨论】:

    • 我的问题不是构造url,而是解析它。
    【解决方案2】:

    没有标准的方法来做到这一点。

    Wink 支持javax.ws.rs.core.MultivaluedMap。 因此,如果您发送 http://example.com/?a=1&a=15&b=3 之类的内容,您将收到: key a values 1, 15;键b 值3。

    如果您需要解析 ?a[1]=1&a[gv]=15&b=3 之类的内容,则需要获取 javax.ws.rs.core.MultivaluedMap.entrySet() 并执行额外的密钥解析。

    这是您可以使用的代码示例(未测试,因此可能包含一些小错误):

    String getArrayParameter(String key, String index,  MultivaluedMap<String, String> queryParameters) {
        for (Entry<String, List<String>> entry : queryParameters.entrySet()) {
            String qKey = entry.getKey();
            int a = qKey.indexOf('[');
            if (a < 0) {
                // not an array parameter
                continue;
            }
            int b = qKey.indexOf(']');
            if (b <= a) {
                // not an array parameter
                continue;
            }
            if (qKey.substring(0, a).equals(key)) {
                if (qKey.substring(a + 1, b).equals(index)) {
                    return entry.getValue().get(0);
                }
            }
        }
        return null;
    }
    

    在你的资源中你应该这样称呼它:

    @GET
    public void getResource(@Context UriInfo uriInfo) {
        MultivaluedMap<String, String> queryParameters = uriInfo.getQueryParameters();
        getArrayParameter("a", "foo", queryParameters);
    }
    

    【讨论】:

    • 这不是我想要的,因为钥匙对我来说也很重要。所以当我得到 'a' 时,我希望它的值是: {'1':1, 'gv':1}
    • 您建议的格式不是通常的查询参数格式:您将键名与索引混合在一起。无论如何,您可以从地图中获取 keySet() 并自己解析。
    • 这是最初的想法 - 有没有我可以使用的东西而不是自己解析它:)
    • 查询路径的格式是 ?key=value&key=value&key=value... 这是正常格式,应该如何使用。如果你想以不同的方式使用它,这取决于你,但它不是标准的。
    • 无论如何,使用 MultivaluedMap.entrySet() 会帮助你。您将获得已解析的参数。您只需要检查这些键并查看它们是否包含“[]”,这样您就可以构建自己的地图。
    【解决方案3】:

    或者,如果您使用的是 HttpServletRequest,那么您可以使用 getParameterMap() 方法,它将所有参数及其值作为映射提供给您。

    例如

    public void doGet(HttpServletRequest request, HttpServletResponse response)
                  throws IOException {
    
       System.out.println("Parameters : \n"+request.getParameterMap()+"\n End");
    
    }
    

    【讨论】:

    • 我认为你不明白我想要什么。请再次阅读帖子。另外,我给出的链接答案 - PHP 中的实现
    • 您提到的 URL 是由您的代码形成的,还是您只是收到它?好像您可以将 URL 创建更改为 example.com/?foo=1&bar=15&b=3 然后使用上面的代码,您将获得键为 foo、bar..etc 和值为 1、15...等的地图
    • 好的,但是如何区分 foo 和 bar 是 a 的键而 b 不是?
    • 一种方法是保持固定格式,即最后一个参数是 b 或第一个参数是 b。
    • 另一种方法是将 'a' 作为 JSONObject 传递(例如 www.example.com/?a={'foo':1, 'bar':15}) 并且他们使用 request.getParameter(" a") 并使用链接中给出的代码将 json 转换为 Map:techtamasha.com/convert-json-to-map-in-java/168
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-26
    • 1970-01-01
    • 2016-09-19
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    相关资源
    最近更新 更多