设计以RESTful方式工作的复杂API指南?

设计以RESTful方式工作的复杂API指南?,api,rest,Api,Rest,我尝试了RESTfulAPI概念,发现它是构建资源API的一种很好的思维方式。例如,将comment添加到post将是 POST /posts/{id}/comments 然而,在某些情况下,如果我错了,请纠正我,预期的API实际上不能作为简单的CRUD建模 例如,将产品添加到系统需要添加图片,添加多个标签指定其类别 我如何以平静的方式来做这件事 1.)我是否强制API用户在多次API调用后跟随 POST /pictures -- add picture GET /categories --

我尝试了RESTfulAPI概念,发现它是构建资源API的一种很好的思维方式。例如,将
comment
添加到
post
将是

POST /posts/{id}/comments
然而,在某些情况下,如果我错了,请纠正我,预期的API实际上不能作为简单的CRUD建模

例如,将
产品
添加到系统需要添加
图片
,添加多个
标签
指定其
类别

我如何以平静的方式来做这件事

1.)我是否强制API用户在多次API调用后跟随

POST /pictures  -- add picture
GET /categories -- get selected category
POST /tags       -- add tags
POST /products  -- input picture, category, tags ids as JSON fields 
2.)是否使用自动查找所有子资源的嵌套对象

POST /products -- input nested JSON array with picture/category/tags object field
在这种情况下,所有子资源都将是现有资源,而不是应该发布的一些(
picture
tags
)。 另外,如果添加
图片
在内部成功,但添加
标记
失败,会发生什么情况

3.)我只是做一个随意的API吗?这和休息有什么关系?这不是打破了宁静的想法吗

POST /add_products
对于RESTful API,是否有处理复杂API的指南


谢谢。

在我看来,人们对REST最大的误解之一是内部模型(db中的表或mongo中的文档)和REST资源必须相同。REST资源可以是一个真实的模型,也可以是数据库中可能不存在的抽象实体

因此,在这种情况下,您的带有
POST
的url,即
POST/products
请求对于REST来说是完全正确的。根据我个人的经验,只要保留REST的基本原则,比如

  • 使用正确的HTTP动词
  • 使用正确的状态代码
  • 可缓存体系结构
  • 通过url对资源进行唯一标识
  • 超媒体(如果你能做到这一点)