我想让我的 API 能够在一次调用中为一系列对象设置值。看似合乎逻辑的解决方案是用户在 URI 中定义范围并在请求正文中设置所需的新值。例如,URI 为:
/api/horses/?color=brown
在请求正文中,键/值对将为
key: color
value: red
这将使我们所有的棕色马变成红色。
问题是从 HttpServletRequest 对象获取参数不允许您确定这些参数是在 URI 还是正文中设置的。
也许这里有两个问题:
- 如果存在不同的、普遍接受的 RESTful 方式来在一次调用中对一系列对象设置值,那么它是什么?
- 如果可以同时使用 URI 和请求正文参数,那么如何区分 HttpServletRequest 对象中的参数?
更新:接受的答案解决了如何区分(枚举问题的第二个)。为了解决更新一系列值的一般挑战,我认为最好的方法是限制为一个更新字段并在路径中指定该字段。就像这样:
PUT /api/horses/color?from=brown&to=red
最佳答案
所以您的问题是请求行中编码的参数与 POST 正文中编码的参数之间存在名称冲突。
您始终可以通过调用来区分:
HttpServletRequest.getQueryString()
HttpServletRequest.getInputStream()
显然,你必须使用 URL 库来解析查询字符串(JDK 中的编码/解码器是可以的)和表单数据的库,具体取决于编码(我记得一些名为 commons-codec 的 Apache 项目这个)。
我会采用最简单的避免名称冲突的方法 - 例如,在 URL 参数前加上 filter- 前缀,但对此没有标准规则。
关于java - 区分同一 servlet 请求中的 URI 和请求正文参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35657598/