我正在爲系統設計一個HTTP API並計劃採用REST風格。該系統功能的一部分是管理跨服務器的Windows服務。這自然會建議像GET /servers/:id/services
這樣的端點列出服務器上的已知服務,並使用GET /servers/:id/services/:name
來詳細說明。除了正在創建,刪除和更新(典型的POST
,PUT
,PATCH
和DELETE
)之外,還可以停止,啓動和重新啓動服務。這些操作我不確定如何處理。我認爲這是三個合理的解決方案。REST API標準之外的資源操作
提供具體化的命令,即
POST /servers/:id/services/:name/start
,POST /servers/:id/services/:name/stop
POST /servers/:id/services/:name/stop
和,POST /servers/:id/services/:name/restart
。將運行狀態視爲子資源,即啓動
POST /servers/:id/services/:name/operation
,停止DELETE /servers/:id/services/:name/operation
並重新啓動POST /servers/:id/services/:name/restart_required
。 (這最後至少與系統的內部行爲相匹配 - 它不會立即重新啓動服務,而是發佈到數據庫以重新啓動服務。)使運行狀態成爲屬性並使用
PATCH
執行這些操作,即PATCH /servers/:id/services/:name/ {"status": "started"}
,和PATCH /servers/:id/services/:name {"status": "restart_pending"}
。
我不確定哪個更可取。選項1是可理解的,但它不完全符合REST的精神。選項2在概念上很奇怪,因爲它將服務的屬性視爲單獨(如果是從屬)實體。選項3可能是最乾淨的,主要困難在於它不是很明顯(需要更詳細地閱讀PATCH /servers/:id/services/:name
的文檔。對於哪種方法(包括我錯過的任何方法)的任何想法都能夠最清楚地展示此功能嗎?