【问题标题】:Create a RESTful action without collisions创建一个没有冲突的 RESTful 动作
【发布时间】:2021-05-11 01:28:41
【问题描述】:

我有一个简单的 API 来处理房间中的实际座位分配。

每个座位都是以下资源:

{
  "person_name": "Jermie" // Person sitting in the seat
  "available": False // Seat is currently allocated
  "seat_id": 1111 // Unique seat identifier
}
  • 收到所有席位将转换为GET /api/seats
  • 接收座位状态(谁坐在上面)-GET /api/seats/<seat_id>
  • 创建新席位 - POST /api/seat
  • 删除席位 - DELETE /api/seat/<seat_id>

如何创建一个 REST API 来为用户分配一个空座位?

我可以使用 GET /api/seats?available=True&count=1 返回一个空座位 (1234),并分配它 - PUT /api/seats/1234,正文为 {"available": False, "person_name": Robbie}

这种方法的问题是我有大量的请求。两个人同时运行搜索空座位,将导致同一个座位被分配两次。

我可以尝试 POST /api/seats/1234/assign 并返回 HTTP 409 CONFLICT(如果已分配),但这会导致发生许多冲突,并且很快,客户端就会不断地相互竞争。

另一个选项是使用POST /api/assignSeat。然而,这种方法不是 RESTful。

这是一个非常简单的问题,我可能不是第一个遇到它的人,但是我在此过程中遇到的“HATEOAS”和许多其他术语实际上并没有给出解决方案。这对我和其他人的理解非常重要。

我是否可以在遵循 REST 原则的同时创建这样的 API?

【问题讨论】:

    标签: rest http url


    【解决方案1】:

    听起来您在解释“REST = CRUD”。我认为这是一个有用的模式,也是 REST api 的一个很好的默认值。

    但是,在某些情况下,此默认设置并不能很好地发挥作用。你所描述的听起来像是其中一种情况。

    因此,在这种特定情况下,拥有一个与 POST 一起使用的特殊的类似 RPC 的端点对我来说听起来像是很好的架构。它也不是严格意义上的非 RESTful。

    REST 描述了 Web 的工作原理,而 HTML 表单是 Web 不可或缺的一部分。许多 HATEOAS 格式都有描述这种“动作”的方法,而这些格式可能是最接近实际 REST 的格式。

    【讨论】:

    • 非常感谢您的快速回复。您将如何使用 HATEOAS 实现这一点? /api 会返回“分配”链接吗? /api/seats 会返回它吗(连同整个数据库的大量转储)?分配一个空座位肯定与特定的/api/seats/<seat> 无关。
    • 如果客户的主要功能之一是寻找座位,我可能会直接从“家庭文档”中显示该操作。例如:API 命中的第一个端点。该链接确实可以具有 rel assign-seat。如果您使用 HAL,您可以从端点切断“HAL 表单”:rwcbook.github.io/hal-forms
    • 服务器应该是“服务”
    猜你喜欢
    • 2021-11-27
    • 2012-08-21
    • 2019-03-10
    • 1970-01-01
    • 1970-01-01
    • 2016-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多