2017-02-28 47 views
0

我試圖創建一個遵循REST最佳實踐的API,它很直觀,並且與開發人員從其他(精心設計的)API看到的模式相匹配。我相信我理解HTTP動詞典型的資源的不同映射,這是符合這兩個問題的答案:在REST API中處理CRUD需要POST時

Which HTTP methods match up to which CRUD methods?凡遇到麻煩

Understanding REST: Verbs, error codes, and authentication

是,由於我們業務的性質以及檢索數據(通常是GET)所需的數據,我們需要使用POST。這是由於請求的大小以及我們爲了執行搜索而傳遞的內容。

When do you use POST and when do you use GET?

所以,有幾個方法我能想到的就如何最好地處理CRUD,我也喜歡一些建議:

  1. 使用查詢參數在POST用於區分CREATE vs READ,其他動詞正常。不喜歡這個想法。
  2. 每個動作都有一個單獨的終結點,例如/ baseUrl/lookup,/ baseUrl/create。不遵循使用名詞而不是動詞的正確模式。

編輯:在清晰起見,在我的圖像查找服務,其中呼叫者可以搜索圖像是否是已經在數據庫中的意見人爲的例子,添加一個新的形象,更新圖像(例如添加元數據)或刪除圖像。

創建:我們應該在這裏做什麼? POST/image /創建並將Read端點更新爲/ image/search?

閱讀: POST /圖像{的imageData = someBase64EncodedImage}

更新: PUT /圖像/ {圖像標識}

刪除: DELETE /圖像/ {圖像標識}

+0

我們需要一個更接近實際的例子。也就是說,當GET時不得不使用POST的問題聽起來像是在檢索查詢字符串中的明確信息(如ID之類的東西)中的資源列表,這是使用分頁解決的 – JSelser

+0

作爲類似的例子,讓我們說谷歌逆向圖像搜索,但在我們的情況下,它只是返回最佳匹配。因此,您需要發佈圖像以查看是否有非常接近的圖像(在某個閾值內),否則不會返回任何圖像。您可能還想要將圖像添加到數據庫中,以便稍後檢索。 IT不是真正的分頁問題,​​也不是太多的數據被返回。這就是使用POST進行創建和檢索都很麻煩。 – Matt

+0

你可能想用一個最接近你的問題的例子更新你的問題,以獲得更好的答案。特別是我不能根據上下文來推斷你的資源是哪一種,然後呢? – JSelser

回答

1

我認爲使用POST來檢索資源存在誤解。

我需要從服務器檢索匹配了大量的參數實體的名單: 從更高的角度來看,你如下陳述問題。我怎樣才能做到這一點?

因此,看到POST作爲請求READ的意思的試探性很強。而且,同時也是誤導。無處不在,您會聽到REST福音傳教士宣誓應該通過GET實施READ,並且使用POST進行的隧道操作是REST 反模式

問題的解決方案非常簡單,它是關於改變我們的方法。這不是POST讀取。這是關於向服務器提交請求票據,等待回覆。事實上,這絕對是我們使用POST所做的。 A POST創建一個子資源,期間(是的,它也可以用於更新,但我不想迷失在細節中)。

所以,如果你想查詢一個複雜資源的服務器,只需放置一張票並等待響應。讓我們來看看一個用例:

你必須通過以下URI

http://authority/api/cars/{id}

,並說,你想通過發出POST來查詢一個非常複雜的方式在服務器識別的car資源。

你會使用什麼端點?絕對不能用

POSThttp://authority/api/cars

去,因爲如果你這樣做,你希望得到什麼是什麼,但有車的創造,不是嗎?解決方案又是非常簡單的。您正嘗試向服務器提交查詢票據,因此您應該設置此資源。你可能是更有創意,但也許這可能是工作

POSThttp://authority/api/tickets/cars

POST荷蘭國際集團查詢車票此端點,你可以期望有一個響應背部採用了location頭指的是汽車的一個列表(汽車資源)匹配您的請求(狀態代碼201 = creted或202 =接受,結果將盡快準備就緒)。如果計算速度夠快,將結果包含在HTTP響應中(個人觀點)並不是一個致命的錯誤。

有關更全面的論文,請參閱這篇精彩文章:How to GET a Cup of Coffee

+0

在原始問題中明確添加了我的示例。你鏈接的文章對我來說很有意義,而且我認爲我早就遇到了它,但是你和文章都假設POST正在創建一個新資源。在我的情況下,POST不創建資源,但出於安全性,緩存和查詢大小的原因,不能成爲GET。作爲一個閱讀操作,我在概念上很好,我只想弄清楚這裏的最佳做法。回答你的問題,似乎你正在擴展端點的陣營。我更願意將資源作爲一個通用基礎(例如圖像) – Matt

+0

據我所知,POST具有非常特定的語義。它創建/更新子資源。你不能強迫POST來傳達不同的意思(此外,根據定義,POST不安全也不冪等,如果以安全或冪等方式使用它,請考慮兩次)。在我看來,你的例子是一個rev。圖像搜索減少到我的解決方案:「*嘿服務器,找到我這張圖片* = *嘿給我結果根據我提交的機票*」。你沒有設計新資源的限制爲正確使用POST閱讀留下了空間,恐怕你不能以這種方式很RESTful, – MaVVamaldo