2013-08-01 89 views
2

我一直在研究/创建一个REST api,在backbone.js到php上下文中。REST API请求方法输入参数

我明白HTTP动词的概念,并当他们应使用

GET - select

POST - create

PUT - update

DELETE - delete

我也明白传递一个标识符的概念作为语义网址,例如

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/

创建一个新元素i将假设输入值将发送作为POST参数/ PHP中语法这被表示为$_POST。但这不起作用。

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

这是REST API的标准公平吗?或只是“轨道风味”的?

+1

我也想知道这一点。在我看来,对于请求或响应主体的格式,REST风格的API中没有任何真正的标准,而且我所看到的关于构建REST API的许多内容基本上掩盖了这个问题。我通常在请求和响应主体中使用纯JSON编写它们,而不是表单编码。 – Troy

回答

1

PUT,POST,PATCH等(除了GET和DELETE *之外的所有东西)接受请求主体。一般数据作为传递之一:

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

  • 其他流行的请求主体格式是使用Content-Type: application/json然后写出一个JSON字符串到主体。这可以通过file_get_contents('php://input')访问,然后使用JSON解析器进行分析。

*关于DELETE的注意事项:it's a little unclear whether or not using a request body with DELETE is allowed or a good practice

+0

如果API调用是通过公共URL进行的,您也可以使用Runscope来检查请求/响应/ shamless_plug –

+0

我喜欢检查是否存在Content-Type标头设置为application/x-www-form-urlencoded的想法。然后读取请求正文或php输入。感谢名单! – xero

+0

该框架可能已经为你做了。 –