2012-04-04 152 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