如何在 REST API 中更新资源视图计数?

How to update a resource view count in REST API?

我有一个包含视频的应用程序。每个视频都有一个观看次数(由 属性 total_views 表示)以及其他属性,例如标题、上传者等。每次播放视频时,视频观看次数应增加 1 requested/watched。此应用程序的前端是 Next.js SPA,后端是 Lumen/Laravel REST API.

当前 REST API 后端解决方案 returns 在 API 上调用 GET /videos/{id} 端点时,total_views 作为视频实体的一部分。

我不确定如何以最符合 REST 普遍接受的约定的方式实施视频计数更新。 我想更新 GET /videos/{id} 请求的计数,但我认为这不符合 REST standards/specification 标准(导致缓存等问题),因为 total_views 属性 中的实体 object 也在更新。 我想到的第二个选项是使用另一个端点,例如 POST/PUT/PATCH /videos/{id}/views。但是,我不想使用请求 body,因为后端 API 应该始终只递增 1(这样可以避免客户端篡改视图计数)。此选项的另一个缺点是它引入了额外的开销,因为除了获取视频信息的 GET 请求之外,它还需要发送另一个 HTTP 请求。

你有什么建议?

编辑:此处的视频观看次数也可能被视为页面观看次数而不是实际视频views/plays(视频资源 意见)。过滤掉爬虫、机器人的页面浏览量或访问者未启动视频的视图的准确观看次数不在本问题的范围内。

视频由外部第 3 方主机托管,并且仅通过嵌入代码 (iframe) 嵌入此应用程序的视频网页中。

要正确地做你想做的事,你真的需要一个'increment'操作。此操作不需要以前的计数,发送新的总数。

最合适的 HTTP 方法确实是 PATCHPATCH可以做很多事情,意义由你决定。例如,如果您的 PATCH 请求如下所示,则 100% 正确:

PATCH /videos/{id}/views
Content-Type: application/vnd.your-company-name.increment
Content-Length: 0

你也可以发明一点JSON格式:

PATCH /videos/{id}/views
Content-Type: application/vnd.your-company-name.increment+json

{
  "action": "increment"
}

第一种格式根本不使用主体,这正是您所要求的..但是由于您使用空主体的目的是防止篡改数字,因此实际上并不需要使用空主体。

对于那些只使用 JSON API 的用户来说,你有一个没有主体的端点可能不会那么令人困惑,所以第二个例子是一个非常小的 JSON 文档,它只是告诉服务器增加观看次数。

您并不严格必须使用自定义 mime 类型。这是个好主意,但如果您不想使用,也可以分别对这两个请求使用 application/octet-streamapplication/json

更好的计划

我确实相信对视频本身的 GET 请求实际上更好,而不是通过 javascript 作为 side-effect 进行跟踪。

鉴于您提到您使用的是 PHP,例如您可以使用 XSendFile 模块执行此操作(如果您使用的是 nginx,其他服务器可能具有等效功能):

https://www.nginx.com/resources/wiki/start/topics/examples/xsendfile/

一般步骤是:

  1. 用PHP
  2. 拦截对实际视频的GET请求
  3. 计算观看次数
  4. 使用 XSendFile 发送文件(这样您就不会在发送视频期间保持活动的 PHP 进程)。

如果文件完全托管在其他东西上,比如 S3,可能还有一些方法可以进入服务器访问日志并计算那里的 GET 请求。