Php RESTAPI-为什么使用PUT DELETE POST GET?
所以,我在浏览一些关于创建RESTAPI的文章。 其中一些人建议使用所有类型的HTTP请求:比如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
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