RE表示S tate T传输的想法不是以尽可能最简单的方式访问数据。
您建议使用post请求来访问JSON,这是访问/操作数据的完美有效方式。
REST是一种有意义的数据访问方法。当您在REST中看到请求时,它应立即显示数据发生的情况。
例如:
GET: /cars/make/chevrolet
可能会返回一系列雪佛兰汽车。 一个好的REST api甚至可能在查询字符串中包含一些输出选项,?output=json或者?output=html允许访问者决定应该编码信息的格式。
有点思考如何合理地整合数据类型为REST API后,我已经得出结论,最好的办法明确指定的数据类型是通过已存在的文件扩展名,例如.js,.json,.html,或.xml。丢失的文件扩展名默认为默认格式(例如JSON); 不受支持的文件扩展名可能会返回501 Not Implemented状态代码。
另一个例子:
POST: /cars/
{ make:chevrolet, model:malibu, colors:[red, green, blue, grey] }
可能会在数据库中创建一个新的雪佛兰malibu与相关的颜色。我说可能因为REST api不需要与数据库结构直接相关。它只是一个屏蔽接口,以便保护真正的数据(将其视为数据库结构的访问器和更改器)。
现在我们需要讨论幂等性问题。通常,REST 通过HTTP 实现CRUD。HTTP使用GET,PUT,POST和DELETE为请求。
一个非常简单的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
并使用ID结果数据发出delete请求:
Delete: /cars/id/[oldest id]
此方法的一个问题是,如果/cars在/oldest请求的时间和delete发布时间之间添加了另一个项目。