REST API - 为什么使用 PUT DELETE POST GET?

2022-08-30 06:40:33

所以,我正在浏览一些关于创建REST API的文章。其中一些建议使用所有类型的HTTP请求:例如.例如,我们将创建索引.php并按以下方式编写API:PUTDELETEPOSTGET

$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服务(还)了解不多。但是,通过常规或(将包含方法名称和所有参数)接受JSON对象,然后以JSON进行响应,岂不是更容易。我们可以通过PHP轻松序列化/反序列化,并对这些数据做任何我们想做的事情,而不必处理不同的HTTP请求方法。POSTGETjson_encode()json_decode()

我错过了什么吗?

更新 1:

好的 - 在深入研究了各种API并学习了很多关于XML-RPCJSON-RPCSOAPREST的知识之后,我得出了一个结论,即这种类型的API是合理的。实际上,堆栈交换几乎在他们的网站上使用这种方法,我确实认为这些人知道他们在做什么Stack Exchange API


答案 1

RE表示性State Transfer的想法并不是以最简单的方式访问数据。

您建议使用 post 请求来访问 JSON,这是访问/操作数据的完全有效方式。

REST 是一种有意义的数据访问方法。当您在 REST 中看到请求时,应该立即看到数据发生了什么。

例如:

GET: /cars/make/chevrolet

很可能会返回雪佛兰汽车的清单。一个好的 REST API 甚至可以在查询字符串中包含一些输出选项,如 ?output=json?output=html,这将允许访问器决定信息应该以哪种格式编码。

在考虑了如何合理地将数据类型合并到REST API之后,我得出的结论是,显式指定数据类型的最佳方法是通过已经存在的文件扩展名,例如,,,或。缺少文件扩展名将默认为默认的任何格式(例如JSON);不支持的文件扩展名可能会返回“501 未实现”状态代码.js.json.html.xml

另一个例子:

POST: /cars/
{ make:chevrolet, model:malibu, colors:[red, green, blue, grey] }

可能会在数据库中创建一个具有相关颜色的新雪佛兰马里布。我说可能是因为REST API不需要与数据库结构直接相关。它只是一个屏蔽接口,以便保护真实数据(将其视为数据库结构的访问器和赋值器)。

现在我们需要进入幂等性问题。通常 REST 通过 HTTP 实现 CRUD。HTTP 对请求使用 、 和 。GETPUTPOSTDELETE

REST 的非常简单的实现可以使用以下 CRUD 映射:

Create -> Post
Read   -> Get
Update -> Put
Delete -> Delete

此实现存在一个问题:Post 被定义为非幂等方法。这意味着对同一 Post 方法的后续调用将导致不同的服务器状态。获取,放置和删除,是幂等的;这意味着多次调用它们应该会导致相同的服务器状态。

这意味着诸如以下请求:

Delete: /cars/oldest

实际上可以实现为:

Post: /cars/oldest?action=delete

Delete: /cars/id/123456

如果您调用它一次,或者调用它 1000 次,将导致相同的服务器状态。

处理项目删除的更好方法是请求:oldest

Get: /cars/oldest

并使用 from 生成的数据发出请求:IDdelete

Delete: /cars/id/[oldest id]

此方法的一个问题是,如果在请求和发出之间添加了另一个项目。/cars/oldestdelete


答案 2

这是一个安全性和可维护性问题。

安全的方法

只要有可能,您应该使用“安全”(单向)方法,如GET和HEAD,以限制潜在的漏洞。

幂等方法

只要有可能,你应该使用“幂等”方法,如GET,HEAD,PUT和DELETE,这些方法不会产生副作用,因此不易出错/更容易控制。


推荐