假设您有一组资源,如下所示:
/v1/API/Events
/v1/API/Transactions
事件如下:
{
"id":1,
"name":"blah",
"date":"2010-01-11",
"duration":1231231,
"transaction_id":3
}
除了可以省略transaction_id或设置为null
交易看起来像:
{
"id":1,
"name":"transaction_name",
"date":"2015-01-01"
}
现在问题在于,有时候能够同时获得Tranaction和它的事件是有益的。能够POST
与其事件进行交易绝对是有益的。即。
{
"name":"new_transaction_one",
"events": [
{
"name":"blob",
"date":"2010-01-01,
"duration":10
},
{
"name":"blob_2",
"date":"2010-01-010,
"duration":15
},
]
并且能够发出GET
请求也很有用:
/v1/API/Transactions/1?withEvents=Y
其他选择是拥有另一个资源:
/ V1 / API / TransactionsWithEvents
但是如果您有包含多个不同子记录集的对象,则必须具有许多不同的组合。我也不喜欢他们有不同的路径事件,虽然我们谈论相同的资源。
我倾向于在GET
请求中使用查询参数,但我想知道是否有任何陷阱。
答案 0 :(得分:2)
这是典型的RESTful API脚手架达到其限制的情况。可能最好创建一些可以跨不同资源工作的便捷方法(特别是对于POST),例如,在单个POST中创建事务和关联事件。您会发现大多数具有相对复杂程度的服务都需要有方便的方法来防止用户(使用相同的示例)创建事务,从响应中读取事务ID,然后创建事件,然后创建事务到事件关系。
将它绑回到你的例子,这可能意味着你有一个像
这样的方法POST /v1/API/CreateTransactionWithEvents
对于使用事务返回事件的情况,您可能不需要类似的便利端点,因为我认为您的参数字符串方法可能在这里有意义,因为您只是通过相关事件来丰富从记录返回的数据。
GET /v1/API/Transactions/{ID}?withEvents=1
这更像是一个灰色区域,并且真正受到其他API的最佳效果(因此您没有做出完全不同的事情),为客户提供清晰的API等。
只需将典型的与资源相关的端点(即事务和事件)视为RESTful服务的主要骨干,并添加适当的便捷方法,以解决骨干端点无法轻松处理的特定资源CRUD用例。这可能是您希望阻止客户端进行一系列API调用以获取您可能在单个调用中提供的内容,或者您需要通过单个API调用执行跨资源的原子添加记录等操作的情况。