创建一个没有冲突的RESTful操作



我有一个简单的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 = CRUD'。我认为这是一个有用的模式,也是REST api的一个很好的默认值。

然而,在某些情况下,这个默认值不能很好地工作。你所描述的情况听起来就像是其中之一。

所以有一个特殊的类似rpc的端点与POST一起用于这个特定的情况对我来说听起来是个很好的架构。它也不是严格意义上的非restful。

REST描述了web是如何工作的,而HTML表单是web不可分割的一部分。许多HATEOAS格式都有一种方法来描述这样的"动作",这些格式可能是最接近实际REST的。

最新更新