2014-01-13 44 views
15

設計API端點以檢查資源是否存在的最佳/安寧的方式是什麼?在RESTful API中檢查資源存在的正確路線

例如有一個用戶數據庫。當新用戶嘗試註冊時,我想檢查電子郵件是否已被即時使用。

我的想法是:POST /user/exists和有效載荷將是類似{"email": "[email protected]"}。響應可能是200 OK或409 Conflict。

這是一個正確的方法嗎?

謝謝!

+0

你可以做到這一點,但悲劇的解決方案是更好,因爲a)您不必構建體,B)的反應是緩存和c)它準確地描述了要求爲使用GET安全。 –

回答

3
GET /[email protected] 

這是一個基本的搜索查詢:找到具有指定電子郵件地址的用戶。如果沒有用戶存在,則迴應空集合,或者回復匹配條件的用戶。

+0

您可以返回204並且不返回正文或404以表示沒有發現任何內容。這樣可以避免在負面情況下解析身體。 –

+0

我在這裏反對使用404:用戶資源確實存在並且可接受地處理請求。 204更接近真相,但我個人會發現一個更容易解析的空集合。 –

+3

當然'/用戶'存在,但這不是我想要獲取的資源。我正在嘗試GET'/ users?email = foo @ bar.com',並且該資源不存在。查詢參數與路徑參數一樣是資源識別的一部分。 –

2

我相信只要檢查是否存在的正確方法就是使用HEAD動詞來表示您通常會通過GET請求獲得的任何資源。

我最近遇到了一種情況,我想檢查服務器上是否存在潛在的大型視頻文件。我不希望服務器嘗試開始將字節流式傳輸到任何客戶端,所以我實現了一個HEAD響應,該響應只是返回客戶端在執行該視頻的GET請求時收到的標頭。

您可以查看W3規範here或閱讀this blog post關於HEAD動詞的實際用法。

我認爲這很棒,因爲您不必考慮如何形成與正常RESTful路線不同的路線,以檢查是否存在任何資源,無論是文件還是典型資源,像用戶或其他東西。

9

HEAD是存在檢查最effecient:

HEAD /users/{username} 

請求用戶的路徑,並返回一個200,如果他們存在,或404如果他們不這樣做。

請注意,您可能不想公開檢查電子郵件地址的端點。它打開了安全和隱私的漏洞。已經在網站上公開顯示的用戶名(例如在reddit上)可能沒問題。

+0

我想這隻會在用戶名是用戶的「主鍵」時才起作用。最常見的是一個API有一個'GET/users/{id}',但是這個資源將與'HEAD/users/{username}'衝突,因爲在理論上HEAD方法要求響應與一個GET請求。 – Dherik

0

我喜歡:

HEAD /users/email/[email protected] 

說明:您正試圖通過所有用戶有人正在使用的電子郵件[email protected]找到。我假設這裏的電子郵件是而不是是您的資源的關鍵,並且您有一定的靈活性,因爲如果您需要另一個點檢查用戶提供的其他信息的可用性,則此方法非常適合。

作爲響應,您只返回200(如果不可用)或404(如果可用)返回http代碼響應。

您還可以使用:

HEAD /emails/[email protected]

如果HEAD /users/email/[email protected]衝突與現有的其他資源一樣,具有不同的業務規則GET /users/email/[email protected]。如Mozilla's documentation,中所述,HEAD方法要求響應與GET請求的響應相同,但沒有響應主體。。所以,擁有不同規則的GET和HEAD並不好。

一個HEAD /users/[email protected]是一個不錯的選擇太多,如果電子郵件是在users的「鑰匙」,因爲你(可能)有GET /users/[email protected]