2011-02-03 48 views
1

我有用戶集合與用戶的。用戶 - ID,FName,LName。URI插入和更新公約 - WCF Rest API

對於插入,我通過Id,FName,LName的用戶實例。該服務插入用戶,如果它不存在。

爲了更新,我再次通過用戶實例與所有參數。該服務使用給定的ID更新用戶的FName和LName。

我想插入和更新爲2個單獨的方法在服務中。

對於這兩種方法,我不能有相同的URI。像下面這樣:

[WebInvoke(UriTemplate = "Users", Method = "PUT")] 
    void UpdateUser(User instance); 

    [WebInvoke(UriTemplate = "Users", Method = "PUT")] 
    void AddUser(User instance); 

這是實現這個目標的最好方法嗎?

我不跟一個職位話說更新URI同意有類似:

[WebInvoke(UriTemplate = "Users/{userId}", Method = "PUT")] 
    void UpdateUser(string userId, User instance); 

因爲,用戶ID是在Userinstance已經存在。

雖然我同意PUT方法可以執行插入和更新。出於某種原因,我需要讓他們分開。

+0

我不喜歡你有兩個相同的URL的事實 - 一旦你做了一個插入,另一次你做了更新。這不是很清楚....我肯定會**更喜歡`INSERT = PUT到/ Users`和`UPDATE = POST到/ Users/{id}` - 它從一開始就更清楚你想要的東西做 – 2011-02-03 13:35:09

回答

1

你可以看一下這幾個方法

  • PUT - 更新,但如果提供的ID不存在,則插入
  • POST - 用於創建 ,插入多次,因爲它 喜歡即使你通過了相同的數據 在多次因爲它忽略了IDS

所以我會說:

  • 使用POST添加用戶:/用戶(但是您可以在理論上使用PUT來完成此操作)。
  • 更新用戶:/用戶/ {} userId的使用PUT

,因爲它會再與GET ...或刪除用戶,/用戶獲得用戶信息,/用戶/ {} userId的/ {userId}與刪除。

不知道這是否有助於或沒有,如果沒有的話,讓我知道,我會:-)

+0

+1我會保持插入(PUT到/用戶)和更新(POST到/ Users/{id})的URI模板分開 - 不要開始讓兩個方法響應相同的URI模板,基於值在對象..... – 2011-02-03 13:33:20

3

PUT再試一次,作爲一個idempotent操作應建立在你把該URL的新資源或完全替代現有資源(在此輸入此資源)。如果您多次對同一個URL執行相同的PUT,您仍然會得到相同的資源。

POST不一定是冪等的,因爲您正在更改現有資源。如果您的POST正在執行某些操作,例如將項目添加到訂單中,並且將相同的數據發佈到相同的URL多​​次,那麼您最終可能會得到包含同一項目的倍數的訂單。

簡短的回答,讓你插入PUT操作並更新POST。

我認爲this SO Answer做了很好的解釋。