一个简单的REST API:
- GET:items / {id}-返回具有给定id的商品的描述
- PUT:items / {id}-更新或创建具有给定id的项目
- 删除:items / {id}-删除具有给定id的项目
现在有问题的API扩展:
- GET:item?filter-返回与过滤器匹配的所有项目ID
- PUT:项目-更新或创建一组由JSON有效负载描述的项目
- [[ DELETE:items-删除由JSON有效负载描述的项目列表]] <-不正确
现在,我对DELETE和PUT操作回收功能感兴趣,可以通过PUT / DELETE项目/ {id}轻松访问该功能。
问题:提供这样的API是否常见?
备选方案:在单连接多个请求时代,发出多个请求很便宜,并且由于更改成功或失败而工作起来更加原子,但是在NOSQL数据库时代,即使请求处理终止,列表中的更改也可能已经发生。内部服务器或出于任何原因的任何原因。
[更新]
在考虑了白宫Web标准和维基百科:REST示例之后,现在使用以下示例API:
一个简单的REST API:
- GET:items / {id}-返回具有给定id的商品的描述
- PUT:items / {id}-更新或创建具有给定id的项目
- 删除:items / {id}-删除具有给定id的项目
顶级资源API:
- GET:item?filter-返回与过滤器匹配的所有项目ID
- POST:项目-更新或创建一组由JSON有效负载描述的项目
不支持/禁止在/ items上执行PUT和DELETE。
使用POST似乎可以解决问题,因为它是一种在封闭资源中创建新项目而不是替换而追加的方法。
HTTP语义POST读取:
通过追加操作扩展数据库
PUT方法需要替换完整的集合以便返回HTTP语义PUT引用的等效表示形式:
给定表示的成功PUT建议,在同一目标资源上进行后续GET将导致在200(OK)响应中返回等效表示。
[UPDATE2]
对于多个对象的更新方面而言似乎更加一致的替代方法似乎是PATCH方法。RFC 5789草案中将PUT和PATCH之间的区别描述为:
PUT和PATCH请求之间的差异体现在服务器处理封闭实体以修改由Request-URI标识的资源的方式。在PUT请求中,封闭的实体被视为原始服务器上存储的资源的修改版本,并且客户端正在请求替换存储的版本。但是,对于PATCH,封闭的实体包含一组指令,这些指令描述了应如何修改当前驻留在源服务器上的资源以产生新版本。PATCH方法影响由Request-URI标识的资源,并且可能对其他资源也有副作用。也就是说,可以通过应用PATCH来创建新资源或修改现有资源。
因此,与POST相比,PATCH可能也是一个更好的主意,因为PATCH允许进行UPDATE,而POST仅允许附加一些意味着添加而无需修改的机会。
因此POST在这里似乎是错误的,我们需要将建议的API更改为:
一个简单的REST API:
- GET:items / {id}-返回具有给定id的商品的描述
- PUT:items / {id}-更新或创建具有给定id的项目
- 删除:items / {id}-删除具有给定id的项目
顶级资源API:
- GET:item?filter-返回与过滤器匹配的所有项目ID
- POST:项目-按照JSON有效负载的描述创建一个或多个项目
- 修补程序:项目-按照JSON有效负载的描述创建或更新一个或多个项目