Php RESTAPI-为什么使用PUT DELETE POST GET?

Php RESTAPI-为什么使用PUT DELETE POST GET?,php,json,rest,soap,restapi,Php,Json,Rest,Soap,Restapi,所以,我在浏览一些关于创建RESTAPI的文章。 其中一些人建议使用所有类型的HTTP请求:比如PUTDELETEPOSTGET。 我们将创建index.php示例,并通过以下方式编写API: $method = $_SERVER['REQUEST_METHOD']; $request = split("/", substr(@$_SERVER['PATH_INFO'], 1)); switch ($method) { case 'PUT': ....some put action

所以,我在浏览一些关于创建RESTAPI的文章。 其中一些人建议使用所有类型的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在他们的网站上几乎都使用这种方法,我认为这些人知道他们在做什么。

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

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

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


你问的

通过普通的$\u POST接受JSON对象,然后用JSON响应不是更容易吗

从维基百科:

RESTful应用程序最大限度地利用预先存在的、定义良好的接口和所选网络协议提供的其他内置功能,并最大限度地减少在其上添加新的特定于应用程序的特性

据我所知(很少),我相信这通常是通过最大限度地使用现有的HTTP动词,并为您的服务设计一个尽可能强大和不言而喻的URL方案来实现的

不鼓励使用自定义数据协议(即使它们是在标准协议(如SOAP或JSON)的基础上构建的),并且应该最小化以最符合REST思想

另一方面,HTTP上的SOAP RPC鼓励每个应用程序设计者定义一个新的任意名词和动词词汇表(例如getUsers()、savePurchaseOrder(…),通常覆盖在HTTP“POST”动词上。这忽略了HTTP的许多现有功能,如身份验证、缓存和内容类型协商,可能会让应用程序设计者在新的词汇表中重新发明这些功能

您正在使用的实际对象可以是任何格式。其思想是尽可能多地重用HTTP,以公开用户希望对这些资源执行的操作(查询、状态管理/变异、删除)


你问的

我错过什么了吗

关于REST和URI语法/HTTP谓词本身还有很多需要了解的内容。例如,有些动词是幂等的,有些则不是。我在你的问题中没有看到任何关于这一点的东西,所以我没有费心去探究它。其他答案和维基百科都有很多好的信息

此外,如果您使用的是真正的restful API,那么在HTTP之上构建的各种网络技术还有很多需要学习的地方。我将从身份验证开始。

代表性状态传输的思想不是以尽可能简单的方式访问数据

您建议使用post请求访问JSON,这是访问/操作数据的一种非常有效的方法

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

例如:

GET: /cars/make/chevrolet
POST: /cars/
{ make:chevrolet, model:malibu, colors:[red, green, blue, grey] }
很可能会退回雪佛兰汽车的清单。一个好的RESTAPI甚至可能在查询字符串中包含一些输出选项,如
?output=json
?output=html
,这将允许访问器决定信息应该以何种格式编码

在考虑了如何将数据类型合理地合并到RESTAPI中之后,我得出结论,明确指定数据类型的最佳方法是通过现有的文件扩展名,如
.js
.json
.html
.xml
。丢失的文件扩展名将默认为任何默认格式(如JSON);不受支持的文件扩展名可能返回错误

另一个例子:

GET: /cars/make/chevrolet
POST: /cars/
{ make:chevrolet, model:malibu, colors:[red, green, blue, grey] }
很可能会创建一个新的雪佛兰马里布在数据库与相关的颜色。我说很可能,因为RESTAPI不需要与数据库结构直接相关。它只是一个屏蔽接口,以便保护真实数据(将其视为数据库结构的访问器和变异器)

现在,我们需要着手解决这个问题。REST通常通过HTTP实现。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次,将导致相同的服务器状态

处理删除
最旧代码的更好方法
GET /zzz/cars.json/1

GET /zzz/cars.xml/1
GET /xxx/cars/1
Accept: application/json
POST /zzz/cars
Content-Type: application/xml     <--- indicates we sent XML to server
Accept: application/json          <--- indicates we want get data back in JSON format