为了账号安全,请及时绑定邮箱和手机立即绑定

如何设计RESTful搜索/过滤?

如何设计RESTful搜索/过滤?

API
心有法竹 2019-08-06 12:57:58
如何设计RESTful搜索/过滤?我目前正在设计和实现PHP中的RESTful API。但是,我没有成功实施我的初始设计。GET /users # list of usersGET /user/1 # get user with id 1POST /user # create new userPUT /user/1 # modify user with id 1DELETE /user/1 # delete user with id 1到目前为止标准相当,对吗?我的问题是第一个问题GET /users。我正在考虑在请求正文中发送参数来过滤列表。这是因为我希望能够在不获取超长URL的情况下指定复杂的过滤器,例如:GET /users?parameter1=value1&parameter2=value2&parameter3=value3&parameter4=value4相反,我希望有类似的东西:GET /users# Request body:{    "parameter1": "value1",    "parameter2": "value2",    "parameter3": "value3",    "parameter4": "value4"}它更具可读性,为您提供设置复杂过滤器的绝佳机会。无论如何,file_get_contents('php://input')没有返回请求的请求体GET。我也尝试过http_get_request_body(),但我正在使用的共享主机没有pecl_http。不确定它会有所帮助。我发现了这个问题,并意识到GET可能不应该有一个请求体。这有点不确定,但他们建议不要这样做。所以现在我不知道该怎么做。您如何设计RESTful搜索/过滤功能?我想我可以使用POST,但这似乎不太RESTful。
查看完整描述

3 回答

?
月关宝盒

TA贡献1772条经验 获得超5个赞

如果您在GET请求中使用请求正文,那么您将违反REST原则,因为您的GET请求将无法缓存,因为缓存系统仅使用URL。

更糟糕的是,您的URL无法加入书签,因为该URL不包含将用户重定向到此页面所需的所有信息

使用URL或Query参数代替请求正文参数。

例如:

/myapp?var1=xxxx&var2=xxxx/myapp;var1=xxxx/resource;var2=xxxx

事实上,HTTP RFC 7231说:

GET请求消息中的有效负载没有定义的语义; 在GET请求上发送有效负载主体可能会导致某些现有实现拒绝该请求。


查看完整回答
反对 回复 2019-08-06
?
慕仙森

TA贡献1827条经验 获得超8个赞

似乎资源过滤/搜索可以以RESTful方式实现。我们的想法是引入一个名为/filters/或的新端点/api/filters/

使用此端点过滤器可以视为资源,因此通过POST方法创建。这种方式 - 当然 - 身体可用于携带所有参数以及可以创建复杂的搜索/过滤器结构。

创建此类过滤器后,有两种方法可以获得搜索/过滤结果。

  1. 将返回具有唯一ID的新资源以及201 Created状态代码。然后使用此ID GET可以使请求/api/users/如下:

    GET /api/users/?filterId=1234-abcd
  2. 新的过滤器通过创建后POST它将不会与回复201 Created,但在一次与303 SeeOther一起Location头指向/api/users/?filterId=1234-abcd。此重定向将通过底层库自动处理。

在这两种情况下,需要进行两次请求以获取过滤结果 - 这可能被视为一个缺点,尤其是对于移动应用程序。对于移动应用程序,我会使用单个POST调用/api/users/filter/

如何保持创建的过滤器?

它们可以存储在DB中,以后再使用。它们也可以存储在一些临时存储器中,例如redis,并且有一些TTL,之后它们将过期并将被删除。

这个想法有什么好处?

过滤器,过滤结果可以缓存,甚至可以加入书签。


查看完整回答
反对 回复 2019-08-06
  • 3 回答
  • 0 关注
  • 1587 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信