2014-06-17 13 views
0

因此,我想創建一個評論系統,該系統的終點類似於:在REST中,您如何處理不適合乾淨地獲取,發佈,放置或刪除的資源

mysite.com/comments/12345 

因此,我希望創建該評論的用戶能夠關閉評論,這將阻止任何額外的評論回覆。我們只是說服務器方法將被命名爲「關閉」。

我的問題:

  • 是什麼網址是什麼樣子?
  • 身體包含什麼? (我認爲它需要包含一些方法來驗證用戶是否正在提交操作,但它是否包含任何其他信息,如是否包含任何附加信息?)
  • 我使用什麼Http動詞?

我可能會使用ASP.Net Web API作爲平臺,雖然這是REST,所以我認爲這應該對解決方案沒有影響。

回答

1

您的情況可能的解決辦法是添加一個字段「關閉」或類似。
您可能已經有一個字段userauthor或類似的內容,指定誰在做請求。

所以,當你創建一個註釋

POST mysite.com/comments HTTP/1.1 

{ 
    "body": "hey sway", 
    "user": "John", 
    "closed": "no" 
} 

這是使用JSON和僅僅是一個例子,我不知道你的服務器是如何實現的,但並不真正的問題。

然後,「封閉」評論你會做一個補丁(部分更新)該資源

PATCH mysite.com/comments/12345 

{ 
    "closed": "yes" 
} 

根據您的服務器是如何實現的,只提供了需要更新的字段/編輯可能就足夠了。但是,因爲你只需要批註的創建者能夠關閉它,你就應該包括在請求user還有:

PATCH mysite.com/comments/12345 

{ 
    "user": "John" 
    "closed": "yes" 
} 

上面的例子假設爲創建註釋的資源ID爲12345像你的榜樣。

然後在服務器上,您可以檢查是否允許John關閉註釋。


所以總結起來

是什麼網址是什麼樣子?

的URL是相同的,因爲它是一個GET

什麼是體包含哪些內容?

需要更新/編輯的所有字段,並user

HTTP動作應怎樣使用?

由於您部分更新資源,因此PATCH最有意義。

+0

因此,繼續觀察我是否有一個體面的理解:「資源」實際上並不一定與存儲在數據存儲中的內容完全一致,是嗎?例如,假設我想禁止一個用戶回覆,我可以擁有一個名爲「banuser」的「屬性」。或者如果我想對評論發表評論,我可以有一個名爲upvote的「財產」。那是對的嗎? – John

+0

@John是的。在這些情況下,對於用戶而言,使用「禁用」字段而不是「banuser」會更有意義,因爲它是一種說明用戶的屬性,而不是操作。選票相同;你會給評論一個字段'upvotes',記錄upvotes的數量,評論有 –

+0

@John我意識到我沒有真正回答你的問題在你以前的評論..「的」資源「實際上並不必與數據存儲中保存的內容完全一致,是嗎?「它實際上是。這裏的關鍵部分是動作沒有在資源的字段中定義,這些字段提供了有關用戶的信息。對某個資源執行某些操作的操作是另一回事 –

0

如果如果評論是封閉的信息是資源的一部分,您可以PUT資源的新版本:

PUT /comments/12345 HTTP/1.1 

{ 
    "id" : "12345", 
    "content" : "something", 
    "replies" : [ "foo", "bar" ], 
    "closed" : true 
} 

按照HTTP Specification必須PUT整個資源:

如果Request-URI指向一個已經存在的資源,則封閉實體應該被認爲是駐留在原始服務器上的一個 的修改版本。

如果您不想發送整個資源可以使用PATCH

PATCH /comments/12345 HTTP/1.1 

{ 
    "op" : "replace", 
    "path" : "/closed", 
    "value": true 
} 

有關詳細信息,請參閱JSON Patch draft

您還可以使用POST來更新資源。已經有很多關於如hereherehere的討論。

相關問題