RESTful API 有关系

RESTful API with relationships

假设我正在为一家餐馆建造 API,并且我有以下资源:

Donut(has_chocolate,has_sprinkles)

Receipt(cost,donut_id)

我的 Web 应用程序将要显示 table 的 receipts 供经理查看。不幸的是 receipt 对象本身并没有足够的用处,经理需要查看 donut 是否有巧克力。

如何最好地做到这一点 - 我可以想到 3 种实现方式:

1) 使用 has_chocolate 附加字段

执行 JOIN 和 return receipt 资源

2) 使用包含所有相关 donut 信息的 donut 对象执行 JOIN 和 return receipt 资源

3) 拉入一页 receipt 个对象,收集 donut_ids 并删除重复项,然后使用它们拉入所需的 donut 个对象 - 一个时间 /donut/id,或一次 /donuts?ids=id1,id2,id3

A RESTful API 应具有解析为资源或资源集合的端点。然后您可以在该端点上执行 HTTP 动词,在本例中为 GET。因此,您需要决定如何为 API 用户定义资源?

是否有两种资源,甜甜圈和收据,就像您的 SQL 一样? 您要将甜甜圈定义为将收据作为字段之一的资源吗?

两者都可以,问题是当您开始制作作为资源的路线时 'with something extra on top'。这开始变得难以让消费者理解而不是 RESTful。

如果是我,我会选择选项3。

  • 为甜甜圈和收据的集合定义两个单独的端点:/v0/donuts//v0/receipts/
  • 允许消费者通过公开必要的过滤器在客户端加入/v0/donuts/?ids=1,2,3,8

您可以创建一条 /v0/events/< id>/ 路线,但考虑到用例是始终获得一批甜甜圈,这将导致消费者往返次数过多。

听起来你也想对这些集合进行分页。在这种情况下,您应该定义一个 max_page_sizedefault_page_size 并且您应该 return 您的客户在响应中有一个 next_page 字段(如果它是最后一页,则该字段为空)。您还必须决定要分页的内容,在这种情况下可能是 id。