2012-04-04 81 views
2

比方說,我想建立一個REST服務做筆記,看起來是這樣的:客戶端ID生成策略

GET /notes/  // gives me all notes 
GET /notes/{id} // gives the note identified by {id} 
DELETE /notes/{id} // delete note 

PUT /notes/{id} // creates a new note if there is no note identified by {id} 
        // otherwise the existing note is updated 

因爲我想我使用PUT來indempotent我的服務創建並更新我的筆記 這意味着新筆記的ID由客戶端設置/生成。

我想過使用GUID/UUID,但它們很長,並且會使URL記住相當困難。同樣從數據庫的角度來看,當用作大表中的主鍵時,從性能的角度來看,這樣的長字符串ID可能是麻煩的。

你知道一個好的身份證生成策略嗎,它會生成短ID並且當然避免碰撞?

回答

8

還有一個原因是高度分散的系統(如等)使用長的UUID /哈希而集中的關係型數據庫(或爲此事)可以簡單地使用int秒。在客戶端以分佈式方式創建短ID不是一種簡單的方法。服務器可以處理它們,或者你必須忍受浪費的ID。通常,它們含有編碼時間戳,客戶端/計算機ID,散列內容等

這就是爲什麼REST服務通常使用

POST /notes 

非冪等保存,然後使用Location:頭的輸出響應:

Location: /notes/42 
+0

好的。但是,如果您的回覆丟失,您如何避免重複創建? – Zounadire 2012-04-04 19:05:39

+0

@Zounadire:你不能(嗯,我相信有一些技巧)。請注意,plain [tag:soap]也不能保證。 – 2012-04-04 19:08:00

+0

完美答案。 – shashankaholic 2012-04-04 20:39:05