我应该允许用户提供的值通过查询字符串传递吗?

时间:2017-01-26 14:02:33

标签: rest url

我将搜索端点添加到RESTful API。阅读this SO answer后,我希望将端点设计为:

GET /users?firstName=Otis&hobby=golf,rugby,hunting

到目前为止,这似乎是一个好主意。但是,我将用于执行搜索的值将由用户通过标准HTML输入字段提供。我会防止服务器端的恶意注入,所以这不是我的顾虑。我更关注用户提供的值会导致网址超过~2000 characters的最大网址长度。

我可以进行一些最大长度验证并添加一些用户提示等,但我想知道是否有更标准的方法来处理这种情况。

我考虑过使用POST /users在请求正文中提供值,但该端点是为新用户创建保留的,因此不会出现。

有什么想法?感谢。

1 个答案:

答案 0 :(得分:0)

我看到了这些可能的解决方案:

  1. 实际上并不是解决方案。使用查询参数并接受长度约束
  2. 选择不应按照您提及的方式设计的POST解决方案。正如您所指出的,如果您将用户POST到.../users,您将创建一个新的用户实体。但这不是你想要做的。您希望将搜索票据提交给服务器,该服务器将返回符合您条件的结果列表。我会设计一些东西

    POST .../search/users在主体中传递搜索项目的表示

  3. 在服务器端和客户端分发查询。假设您有匹配的复杂条件。设置它们的分类,以便最严格的处理服务器端。因此,服务器能够返回可管理的项目列表,您可以随后在客户端进行过滤。在此方法中,您可以通过向服务器仅发送要在搜索中遇到的条件的子集来节省查询字符串中的空间。