Rest API设计:如何为具有多个子资源的POST资源创建restful API?

时间:2017-10-29 18:51:44

标签: rest api restful-architecture api-design

我们是一家电子商务网站,希望创建API,为所有客户提供一个界面,通过此API发送产品相关信息。我们目前需要3种类型的产品信息:

  • basicDetails:喜欢价格,颜色等。
  • 图片:产品图片
  • 评论:该产品的评论

方法1:允许客户通过单一API发送所有信息。

/api/product/
{
    "basicDetails" : {}, //json with all basic details of the product.
    "images": {}, //json containing array of images of the product.
    "reviews": {} //json containing array of reviews of the product.
}

方法2:为所有子资源创建不同的API。

/api/product/basicdetails/
/api/product/images/
/api/product/reviews/

方法3:为具有分层URI的所有子资源创建不同的API。

/api/productBasicDetails/
/api/productImages/
/api/productReviews/

建议采用哪种方法?

1 个答案:

答案 0 :(得分:1)

如果imagesreviews都是产品不可分割的一部分而产品在没有这些产品的情况下不存在,我会选择方法1,因为在3定义了许多用户可能会发现不清楚如何使用它们的端点。

否则,方法2似乎是最好的,也是最清晰的方法。让您的客户创建包含所有基本详细信息的产品。响应POST请求,201 Created应与Location标头一起发送,标头包含指向新创建资源的URL。然后,要编辑产品本身,请直接发送请求/api/product/{id}/。要更新/删除/创建子资源(即imagereview),请分别向/api/product/{id}/images//api/product/{id}/reviews/发送相应的请求。通过这种方式,您可以清晰地分离关注点以及易于理解和一致的API。如果添加了任何其他资源,您仍然在单根端点区域中操作而不是多个(如方法3中所示)。

此外,方法1的缺点是身体可能难以为客户构建 - 例如可选images - 是否会发送空值或根本没有密钥?