RESTful API:如何组织嵌套资源

问题描述 投票:-1回答:1

我对如何组织API路由结构有疑问。已经阅读了许多关于构建RESTful API的书籍,但却无法找到答案。每本书都讲述了简单的CRUD操作,以及一个级别的嵌套资源。像/users/users/1/posts。没问题。

例:

但让我们来看看更难的现实生活中的例子:

GET /cars // List of cars
GET /cars/{car_id} // Get single car
POST /cars // Add new car
PUT /cars/{car_id} // Update existing car
DELETE /cars/{car_id} // Delete car by specified ID

cars的数据库表的结构将是

Table "cars"
    - id
    - uuid
    - make
    - model
    - year
    - created_at
    - updated_at
    - deleted_at

到目前为止没有问题,但后来我需要添加嵌套资源。所有使用指定汽车进行的维修。

GET /cars/{car_id}/repairs // List of repairs that were done with car
GET /cars/{car_id}/repairs/{repair_id} // Get single repair
POST /cars/{car_id}/repairs // Add new repair for specified car
PUT /cars/{car_id}/repairs/{repair_id} // Update existing repair for specified car
DELETE /cars/{car_id}/repairs/{repair_id} // Delete repair by specified ID

数据库表的结构将是

Table "car_repairs"
    - id
    - uuid
    - car_id ( foreign key to cars )
    - title
    - description
    - repair_started_at
    - repair_ended_at
    - created_at
    - updated_at
    - deleted_at

到目前为止没问题。像所有书籍一样。一条/users路线和嵌套路线/users/1/posts。但是当我需要添加另一个嵌套级别时,这里开始出现问题。

我需要CRUD路线来解决汽车维修时发现的所有缺陷

GET /cars/{car_id}/repairs/{repair_id}/defects // List of all defects that were found for specified repair for speicified car
GET /cars/{car_id}/repairs/{repair_id}/defects/{defect_id} // Get single defect
POST /cars/{car_id}/repairs/{repair_id}/defects // Add new defect
PUT /cars/{car_id}/repairs/{repair_id}/defects/{defect_id} // Update existing defect
DELETE /cars/{car_id}/repairs/{repair_id}/defects/{defect_id} // Delete existing defect

表结构将是:

Table "car_repair_defects"
    - id
    - uud
    - car_id
    - repair_id
    - name
    - description
    - created_at
    - updated_at
    - deleted_at

问题:

在这里做什么,是.../defects正常做法的水平?

考虑一下情况,如果我需要添加另一个第4级嵌套,例如,用于找到缺陷的所有部分

在RESTful API中嵌套资源时的最佳实践

可以说这可以在没有嵌套的情况下完成。示例/cars /repairs /defects /parts但是,那么,嵌套资源的RESTful示例呢。那么嵌套资源0,1,2,3的最大级别是多少?

此外,如果没有嵌套,例如,您需要创建仅列出所有可能的汽车缺陷的字典路线/defects。所以会有名字冲突。

此外,如果没有嵌套,您将如何过滤项目,您将使用嵌套过滤?

defects?car_id=1&repair_id=2&defect_id=3

像这样 ?这看起来很难看。

有人可以指向一本书或一篇文章,或者给出关于最大嵌套水平和之前列出的问题的答案。谢谢。

rest api crud
1个回答
0
投票

以下是关键点:REST并不关心您使用哪种拼写作为标识符。

也就是说,REST认为这些URI中的每一个都同样好。

/cars/{car_id}/repairs/{repair_id}/defects
/08617423-cc74-4967-9a67-49e4171f01b7

就客户而言,标识符是不透明的;将信息编码到URI中由服务器自行决定,以供其自己专用。

除此之外,标识符拼写约定是有效的代码风格约定;使用与当地风格一致的拼写。

从客户端的角度来看,标识符不描述资源的语义;这是超媒体表现的工作。

© www.soinside.com 2019 - 2024. All rights reserved.