我正在设计一个API,例如,让我们考虑以下场景:
在我的业务领域中总共有三个实体A, B和c。
A到B是一对多关系。B和c是一对多关系
应用中有多条A记录
所以如果我设计REST API,那么它将看起来像这样。
GET /api/A ( return list of A)
GET /api/A/{id} ( return specific record of A)
POST /api/A ( new record)
PUT /api/A/{id} ( update)
Get /api/A/{id}/B ( List of B record with A with specific Id as parent)
与其他端点相同,B到C遵循相同的结构。
现在几个问题。
当我得到A的列表时,我想应用复杂的过滤条件,有些情况下,查询或get操作是不好的
- 是否可以使用POST方法?这是否违反了REST规则?
当UI显示A的记录列表时,同时显示B的计数数和C的计数数。
- 如何公开这些数据?
我们可以使用/api/A/search(用于复杂搜索)暴露POST吗?
还有如何包括其他子属性,仍然遵循REST ?
当我得到A的列表时,我想应用复杂的过滤条件,有些情况下,查询或get操作是不好的
是否可以使用POST方法?这是否违反REST规则?
POST将工作?是的。
这是不是违反了规则?是的。
当信息对应于潜在资源时,使用POST进行信息检索并不是RESTful,因为这种用法会妨碍安全的可重用性和拥有URI的网络效应。——菲尔丁,2009
我们可以使用/api/A/search(用于复杂搜索)暴露POST吗?
POST有和以前一样的问题
但是/api/A/search很好——有许多不同的资源(文档)包括来自相同域实体的信息副本,或者来自多个域实体的信息组合,这是正常的。想想"网页";我们总是把来自不同实体的信息组合到一个网页上。
还有如何包括其他子属性,仍然遵循REST ?
通过理解资源/文档模型与域/实体模型是不同的。