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发布时间之间添加了另一个项目。