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

标签 php json soap rest

所以,我正在浏览一些关于创建 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 服务了解不多(目前)。 但是,通过常规的 POSTGET 接受 JSON 对象不是更容易(这将包含方法名称和所有参数)和然后也以 JSON 响应。我们可以通过 PHP 的 json_encode()json_decode() 轻松地序列化/反序列化,然后对这些数据做任何我们想做的事情,而无需处理不同的 HTTP 请求方法。

我错过了什么吗?

更新 1:

好的 - 在研究了各种 API 并了解了很多关于 XML-RPCJSON-RPCSOAPREST 我得出的结论是这种类型的 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 对请求使用 GETPUTPOSTDELETE

一个非常简单的 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/

相关文章:

php - 动态下拉菜单

php - 使用 PHP 的原始文本 SOAP 消息

c - gSOAP:如何省略响应中的可选元素?

php - 使用 htaccess 文件将所有流量重定向到 index.php 并将非 www 重定向到 www

Php获取标签之间的字符串

php - URL 可用时的媒体隐私

json - Web API 2 - 返回 JSON,不包括为 false 的属性

ios - 我们如何在 Swift 中上传带有嵌套 JSON 参数的多部分表单数据?

javascript - 我需要将一个对象序列化为 JSON。我正在使用 jQuery。有没有 "standard"方法可以做到这一点?

java - JAX-RPC 1.1 中的公共(public)默认构造函数错误