如何设计RESTful搜索/过滤?

如何设计RESTful搜索/过滤?

我目前正在设计和实现PHP中的RESTful API。但是,我没有成功实施我的初始设计。


GET /users # list of users

GET /user/1 # get user with id 1

POST /user # create new user

PUT /user/1 # modify user with id 1

DELETE /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。


心有法竹
浏览 1589回答 3
3回答

月关宝盒

如果您在GET请求中使用请求正文,那么您将违反REST原则,因为您的GET请求将无法缓存,因为缓存系统仅使用URL。更糟糕的是,您的URL无法加入书签,因为该URL不包含将用户重定向到此页面所需的所有信息使用URL或Query参数代替请求正文参数。例如:/myapp?var1=xxxx&var2=xxxx/myapp;var1=xxxx/resource;var2=xxxx事实上,HTTP RFC 7231说:GET请求消息中的有效负载没有定义的语义; 在GET请求上发送有效负载主体可能会导致某些现有实现拒绝该请求。

慕仙森

似乎资源过滤/搜索可以以RESTful方式实现。我们的想法是引入一个名为/filters/或的新端点/api/filters/。使用此端点过滤器可以视为资源,因此通过POST方法创建。这种方式 - 当然 - 身体可用于携带所有参数以及可以创建复杂的搜索/过滤器结构。创建此类过滤器后,有两种方法可以获得搜索/过滤结果。将返回具有唯一ID的新资源以及201 Created状态代码。然后使用此ID GET可以使请求/api/users/如下:GET /api/users/?filterId=1234-abcd新的过滤器通过创建后POST它将不会与回复201 Created,但在一次与303 SeeOther一起Location头指向/api/users/?filterId=1234-abcd。此重定向将通过底层库自动处理。在这两种情况下,需要进行两次请求以获取过滤结果 - 这可能被视为一个缺点,尤其是对于移动应用程序。对于移动应用程序,我会使用单个POST调用/api/users/filter/。如何保持创建的过滤器?它们可以存储在DB中,以后再使用。它们也可以存储在一些临时存储器中,例如redis,并且有一些TTL,之后它们将过期并将被删除。这个想法有什么好处?过滤器,过滤结果可以缓存,甚至可以加入书签。
打开App,查看更多内容
随时随地看视频慕课网APP