0

Feathers 框架旨在坚持 REST 设计,我知道,但我认为我有一个值得打破规则的边缘案例。我想制作一个音乐播放器 API,允许通过 HTTP 和 Socket.io 以编程方式访问播放器控件。

然而,播放器不是get, put, patch,post和的简单情况delete。将为每个用户创建一个播放器,并且永远不会被删除,只会更改。我想要在方法的子路由上使用自定义方法,例如 play、pause、setQueue 等,例如PATCH /player/playPATCH /player/pause.

这正是Spotify 在他们的 API 中的做法,它比PATCH每次向同一个端点发送请求并手动更新玩家数据更有意义,即。PATCH /player {nowPlaying: {index: newIndex}}跳到下一个曲目,API 的用户必须知道播放器数据的架构及其操作方式。相反,类似的东西PATCH /player/next更有意义并且更易于使用。

如何使用 Feathers 的 API 实现这样的服务,而无需在 express 中手动完成?如果不可能,将自定义快递代码与应用程序的其余部分很好地集成的最友好的方法是什么?

4

1 回答 1

1

尽管 Spotify 似乎是这样做的,但它并没有根据HTTP 规范声明 GET 是一种安全方法,除了检索数据之外不应该有任何副作用:

特别是,已经建立了约定,即 GET 和 HEAD 方法不应该具有采取除检索之外的操作的意义。这些方法应该被认为是“安全的”。

Feathers 在这方面的限制是非常有意避免常见的陷阱(最坏的情况,谷歌爬虫进入并通过跟随页面上的链接删除一堆数据)。

使用 PATCH(或 POST,如果需要)时,您仍然有多种选择。player根据用户 ID创建服务并更新其状态:

PATCH /player/<userId> { "state": "playing" }

创建一个单独的actions服务来接收玩家的状态变化:

POST /action { "userId": "<userId>", "state": "paused" }

优点是 Feathers 将通过 HTTP 和 websockets 自动公开这两个 API,并且您会自动获得两者的实时更新和身份验证,所有这些您都必须在普通 Express 中手动完成。

于 2017-11-26T17:29:45.440 回答