我有一个现有的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");
答案 0 :(得分:2)
根据this question,从技术上讲,没有明确的规范,因此要么技术上正确,要么我有3个理由request.getParameterValues("…")
代码重用:您编写的每段代码都有机会引入错误(例如,在这种情况下,解析器将从您的CSV查询字符串中读取)。通常情况下,引入库有一个缺点,你可能会为一个小函数引入一个重量依赖,或者你可能不清楚第三方在他们的库中做了什么。在这种情况下,它本质上是一个第一方库,因为它是JavaEE实现本身为您提供的方法!它还提供......
意图清晰度:之后阅读您的代码的任何人都会熟悉库方法&马上知道你在做什么。
网址结构:避免使用分隔字符可以提供更具人性化的网址。
由于您提到的是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,这是使用多个参数的另一个好处。
在一个更务实的世界中,答案取决于您的服务将如何使用。由于您重复参数名称,因此使用多个参数会产生开销。如果您的服务每天将被调用数十亿次,那么开销就会增加。