我有一個包含視頻的應用程式。每個視頻都有一個觀看次數(由屬性表示total_views)以及其他屬性,例如其標題、上傳者等。每次請求/觀看視頻時,視頻觀看次數應增加 1。該應用程式的前端是 Next.js SPA,后端是 Lumen/Laravel REST API。
當前的 REST API 后端解決方案在 API 上呼叫端點total_views時將其作為視頻物體的一部分回傳。GET /videos/{id}
我不確定如何以最普遍接受的符合 REST 約定的方式實作視頻計數更新。我想過更新請求的計數,GET /videos/{id}但我認為這不符合常見的 REST 標準/規范(導致快取問題等),因為total_views回應中物體物件的屬性也在更新。我想到的第二個選項是使用另一個端點,例如POST/PUT/PATCH /videos/{id}/views. 但是,我不想使用請求正文,因為后端 API 應該始終只遞增 1(這樣可以避免客戶端篡改視圖計數)。此選項的另一個缺點是它引入了額外的開銷,因為除了獲取視頻資訊的 GET 請求之外,它還需要發送另一個 HTTP 請求。
你有什么建議?
編輯:此處的視頻觀看次數也可能被視為頁面觀看次數,而不是實際的視頻觀看次數/播放次數(視頻資源觀看次數)。過濾掉爬蟲、機器人的頁面瀏覽量或訪問者未開始播放視頻的瀏覽量的準確瀏覽量計數不在此問題的范圍內。
視頻由外部 3 方主機托管,并且僅通過嵌入代碼 (iframe) 嵌入此應用程式的視頻網頁中。
uj5u.com熱心網友回復:
為了正確地做你想做的事,你真的想要一個“增量”操作。此操作不需要先前的計數,發送新的總數。
最合適的 HTTP 方法確實是PATCH. PATCH可以做很多事情,由你決定意義。例如,如果您的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"
}
第一種格式根本不使用正文,這正是您所要求的。但是由于您使用空正文的目標是防止篡改數字,因此實際上不需要使用空正文。
對于只使用帶有 API 的 JSON 的用戶來說,如果你有一個沒有正文的端點,它可能不會那么混亂,所以第二個示例是一個非常小的 JSON 檔案,它只是告訴服務器增加視圖計數。
您不必嚴格使用自定義 mimetype。這是一個好主意,但如果您不想使用也可以分別使用application/octet-streamandapplication/json來處理這兩個請求。
更好的計劃
我確實相信對視頻本身的 GET 請求實際上更好,而不是通過 javascript 將跟蹤作為副作用完成。
鑒于您提到您使用的是 PHP,例如,您可以使用 XSendFile 模塊執行此操作(如果您使用的是 nginx,其他服務器可能具有等效項):
https://www.nginx.com/resources/wiki/start/topics/examples/xsendfile/
一般步驟是:
- 使用 PHP 攔截對實際視頻的 GET 請求
- 計算視圖
- 使用 XSendFile 發送檔案(因此在發送視頻期間您不會保持活動的 PHP 行程)。
如果檔案完全托管在其他東西上,比如 S3,那么可能還有一些方法可以利用服務器訪問日志并計算那里的 GET 請求。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/435920.html
