2

我一直在研究/创建一个REST api,在backbone.js 到php 上下文中。

我了解 HTTP 动词的概念以及何时应该使用它们

GET - select

POST - create

PUT - update

DELETE - delete

我也理解将标识符作为语义 url 传递的概念,例如

GET http://api/users/123

DELETE http://api/users/123

在这些情况下,“123”是业务逻辑用于获取/删除用户的 id。

但是 POST 和 PUT 上下文呢?发送请求时

PUT http://api/users/123

api 将使用提供的参数更新用户 id 123,这就是我的问题出现的地方。

我会假设要更新的输入参数将作为 PUT 参数发送。在 php 语法中,这表示为:(file_get_contents('php://input')这与删除请求相同。)

当通过backbone.js 测试它时,它工作得很好。

但是当我尝试创建一个新元素时

POST http://api/users/

我会假设输入值将作为 POST 参数/在 php 语法中发送,这表示为$_POST. 但这不起作用。

经过一些测试,并阅读了 Rails 风格的 REST API(这是主干文档所建议的),我意识到所有请求变量都是以相同的方式发送的。如果我更改我的代码以用于file_get_contents('php://input')获取每种请求类型的请求参数,则骨干网可以完美运行。

这个标准对 REST api 公平吗?还是只是“铁路风味”的?

4

1 回答 1

1

PUT、POST、PATCH 等(除了 GET 和 DELETE* 之外的所有内容)接受请求正文。通常数据被传递为:

  • 由服务器解码和解析的名称/值对的 URL 编码字符串(与 URL 查询字符串完全相同)$_POST(或类似的,取决于您选择的 Web 框架)。这通常依赖于是否存在Content-Type设置为的标头application/x-www-form-urlencoded(浏览器在提交表单时默认执行此操作)。如果您在其中看到数据file_get_contents('php://input')但没有看到,$_POST则很可能此标头不存在或设置为另一个值。如果您使用的是 Chrome,您可以在开发工具的“网络”选项卡中查看客户端发送的标头和正文。

  • 另一种流行的请求正文格式是使用Content-Type: application/jsonJSON 字符串,然后将其写入正文。这可以通过file_get_contents('php://input')JSON 解析器访问然后解析。

* 关于 DELETE的注意事项:尚不清楚是否允许使用带有 DELETE 的请求正文或一个好的做法

于 2013-08-01T20:43:03.657 回答