【发布时间】:2011-06-28 14:06:38
【问题描述】:
我目前正在用 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¶meter2=value2¶meter3=value3¶meter4=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。不确定它是否会有所帮助。
我找到this question 并意识到 GET 可能不应该有请求正文。这有点不确定,但他们建议不要这样做。
所以现在我不知道该怎么做。您如何设计 RESTful 搜索/过滤功能?
我想我可以使用 POST,但这似乎不太 RESTful。
【问题讨论】:
-
小心!!! GET 方法必须是 IDEMPOTENT,并且必须是“可缓存的”。如果你在正文中发送信息,系统如何缓存你的请求? HTTP 允许仅使用 URL 而不是请求正文来缓存 GET 请求。例如,这两个请求:example.com { test:"some" } example.com { anotherTest:"some2" } 被缓存系统认为是相同的:它们都具有完全相同的 URL
-
只是添加,你应该 POST 到 /users(集合)而不是 /user(单个用户)。
-
要考虑的另一点是大多数应用服务器都有记录 url 的访问日志,因此可能介于两者之间。所以在 GET 上可能会有一些意外的信息泄露。