分隔列表作为URL参数值

时间:2014-06-11 18:59:16

标签: java rest url servlets

我有一个现有的Java Web应用程序,它有大约50个查询参数,类似于

http://localhost/myapp?a=1&b=2&c=3&d=4

我使用ServletRequest.getParameter在servlet中提取值,类似于

String a = req.getParameter("a");

我现有的每个参数都是单值的。我现在需要引入一个多值的新参数。对RESTful实践和servlet规范执行此操作的最佳做​​法是什么?

我正在考虑以下两个选项,但如果有更好的选择,请指出。

逗号分隔的单个参数

http://localhost/myapp?a=1&b=2&c=3&d=4&e=5,6,7,8

将编码为

http://localhost/myapp?a=1&b=2&c=3&d=4&e=5%256%257%258

并提取为

String eStr = req.getParameter("e");
String[] e = eStr.split(",");

多个参数

http://localhost/myapp?a=1&b=2&c=3&d=4&e=5&e=6&e=7&e=8

,不需要任何特殊编码,可以提取为

String[] e = req.getParameterValues("e");

2 个答案:

答案 0 :(得分:2)

根据this question,从技术上讲,没有明确的规范,因此要么技术上正确,要么我有3个理由request.getParameterValues("…")

  1. 代码重用:您编写的每段代码都有机会引入错误(例如,在这种情况下,解析器将从您的CSV查询字符串中读取)。通常情况下,引入库有一个缺点,你可能会为一个小函数引入一个重量依赖,或者你可能不清楚第三方在他们的库中做了什么。在这种情况下,它本质上是一个第一方库,因为它是JavaEE实现本身为您提供的方法!它还提供......

  2. 意图清晰度:之后阅读您的代码的任何人都会熟悉库方法&马上知道你在做什么。

  3. 网址结构:避免使用分隔字符可以提供更具人性化的网址。

  4. 由于您提到的是RESTful,我认为这里的主要内容是适当地使用查询字符串 - 避免使用它们来提供您网站上的静态内容页面(page.html?id=12ndi4t!) - 但是,例如search.html?q=film&category=horror&category=comedy 很好&清除搜索页面。


    getParameterValues(…)方法的缺点是未定义返回值的顺序,因此如果您不能依赖e=5&e=6&e=7生成:

    String[] e = request.getParameterValues("e");
    e[0] //5
    e[1] //6
    e[2] //7
    

    如果这一点特别重要,您可能需要采用上述第一种方法。

答案 1 :(得分:1)

最佳做法是使用多个参数。

http://localhost/myapp?a=1&b=2&c=3&d=4&e=5&e=6&e=7&e=8

我们可以看一下浏览器如何将select和checkboxs视为一个例子:

http://www.w3.org/TR/html401/interact/forms.html#successful-controls

请注意,规范对排序有重要意义 - “控件名称/值按它们在文档中出现的顺序列出”。因此,您可以合理地假设解析库将遵循订单。

对于您的特定情况,在Java世界中,像Spring MVC这样的框架将理解多参数形式并将其绑定到List或Arrays,这是使用多个参数的另一个好处。

在一个更务实的世界中,答案取决于您的服务将如何使用。由于您重复参数名称,因此使用多个参数会产生开销。如果您的服务每天将被调用数十亿次,那么开销就会增加。