如果沒有合理的要創建重複的資源(例如產品具有相同的標題,描述等),那麼唯一標識符可以在服務器上生成,可以對創建的資源進行跟蹤,以防止重複請求正在處理。與在客戶端上生成唯一ID的Darrel's suggestion不同,這也會阻止單獨的用戶創建重複資源(您可能會也可能不會找到)。客戶可以根據他們的回覆代碼(分別爲201和303,在我的示例中)區分「創建」回覆和「重複」回覆。
僞代碼,用於產生這樣的標識符 - 在這種情況下,請求的規範表示的哈希:
func product_POST
// the canonical representation need not contain every field in
// the request, just those which contribute to its "identity"
tags = join sorted request.tags
canonical = join [request.name, request.maker, tags, request.desc]
id = hash canonical
if id in products
http303 products[id]
else
products[id] = create_product_from request
http201 products[id]
end
end
這個ID可以是或可以不是所創建的資源的URI的一部分。就我個人而言,我傾向於分別跟蹤它們 - 以額外的查找表爲代價 - 如果URI將暴露給用戶,因爲哈希值往往對人類難以記憶是醜陋和困難的。
在很多情況下,在一段時間後「過期」這些獨特的哈希也是有意義的。例如,如果您要製作匯款API,則用戶每隔幾分鐘將相同數量的金錢轉移給同一個人可能表示客戶從未收到過「成功」響應。另一方面,如果用戶每月向同一個人轉賬相同數量的金額,他們可能會支付他們的租金。 ;-)
我從來沒有提到服務器打開HTTP連接。這當然可能但不適用於這個用例。但我同意在客戶端可以檢索(最近修改過的)產品列表中增加一項功能可以緩解一些問題。在這種情況下,客戶端將有一種方法來驗證記錄是否已創建。編輯:增加了一個「但」..語句 – Zepplock 2011-02-15 22:45:44