所以,我正在浏览一些关于创建 REST API 的文章。
其中一些建议使用所有类型的 HTTP 请求:例如 PUT
DELETE
POST
GET
。
例如,我们将创建 index.php 并以这种方式编写 API:
$method = $_SERVER['REQUEST_METHOD'];
$request = split("/", substr(@$_SERVER['PATH_INFO'], 1));
switch ($method) {
case 'PUT':
....some put action....
break;
case 'POST':
....some post action....
break;
case 'GET':
....some get action....
break;
case 'DELETE':
....some delete action....
break;
}
好的,当然 - 我对 Web 服务了解不多(目前)。
但是,通过常规的 POST
或 GET
接受 JSON 对象不是更容易(这将包含方法名称和所有参数)和然后也以 JSON 响应。我们可以通过 PHP 的 json_encode()
和 json_decode()
轻松地序列化/反序列化,然后对这些数据做任何我们想做的事情,而无需处理不同的 HTTP 请求方法。
我错过了什么吗?
更新 1:
好的 - 在研究了各种 API 并了解了很多关于 XML-RPC、JSON-RPC、SOAP、REST 我得出的结论是这种类型的 API 是合理的。实际上堆栈交换在他们的网站上几乎使用这种方法,我认为这些人知道他们在做什么Stack Exchange API .
最佳答案
REpresentational State Ttransfer 的想法并不是以尽可能简单的方式访问数据。
您建议使用 post 请求来访问 JSON,这是访问/操作数据的一种完全有效的方式。
REST 是一种有意义访问数据的方法。当您在 REST 中看到请求时,应该立即清楚数据发生了什么。
例如:
GET: /cars/make/chevrolet
可能会返回雪佛兰汽车的列表。 一个好的 REST api 甚至可以在查询字符串中包含一些输出选项,例如 ?output=json
或 ?output=html
这将允许访问者决定什么格式信息应该被编码。
在思考了如何合理地将数据类型合并到 REST API 中之后,我得出结论,明确指定数据类型的最佳方法是通过现有的文件扩展名,例如 .js
、.json
、.html
或 .xml
。缺少的文件扩展名将默认为任何默认格式(例如 JSON);不受支持的文件扩展名可能会返回 501 Not Implemented
status code 。
另一个例子:
POST: /cars/
{ make:chevrolet, model:malibu, colors:[red, green, blue, grey] }
很可能会在数据库中创建一个带有相关颜色的新雪佛兰马里布。我说可能,因为 REST api 不需要与数据库结构直接相关。它只是一个屏蔽接口(interface),以便保护真实数据(将其视为数据库结构的访问器和修改器)。
现在我们需要讨论 idempotence 的问题。通常 REST 通过 HTTP 实现 CRUD。 HTTP 对请求使用 GET
、PUT
、POST
和 DELETE
。
一个非常简单的 REST 实现可以使用以下 CRUD 映射:
Create -> Post
Read -> Get
Update -> Put
Delete -> Delete
此实现存在一个问题:Post 被定义为非幂等方法。这意味着对相同 Post 方法的后续调用将导致不同的服务器状态。 Get、Put 和 Delete 是幂等的;这意味着多次调用它们应该会导致相同的服务器状态。
这意味着一个请求如:
Delete: /cars/oldest
实际上可以实现为:
Post: /cars/oldest?action=delete
而
Delete: /cars/id/123456
如果你调用它一次,或者如果你调用它 1000 次,将导致相同的服务器状态。
处理 oldest
项删除的更好方法是请求:
Get: /cars/oldest
并使用结果数据中的 ID
发出 delete
请求:
Delete: /cars/id/[oldest id]
如果在请求 /oldest
和发出 delete
之间添加了另一个 /cars
项,则此方法的问题是.
关于php - REST API - 为什么使用 PUT DELETE POST GET?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4573305/