2011-09-20 51 views
0

我使用Openrasta我的RESTful Web服務和我有一個小疑問至於方法的參數和URIOpenRasta URI和方法結合澄清 - RESTful Web服務

例如:我下面的用戶設置實體。

配置:

ResourceSpace.Has.ResourcesOfType<User>() 
      .AtUri("/user") 
      .And.AtUri("/user/{userId}") 
      .HandledBy<UserHandler>() 
      .AsJsonDataContract() 
      .And.AsXmlDataContract(); 

處理程序方法PUT:

public OperationResult Put(long userId, User user){} 

URI爲同樣會http://localhost/User/1

請求體將包含如下一個JSON:

{ 
    "userId":1, 
    "userName":"FirstName" 
} 

這裏,我的問題是:用兩個參數定義PUT方法是否正確?如果這是正確的方法,那麼PUT方法中的userId參數將包含與User實體屬性UserId相同的值。

而且,在PUT方法中,我需要驗證這兩個值是否相同,如果它們不相同,則返回BadRequest,表明該URI與請求中提供的實體不匹配。爲什麼我們應該明確地做到這一點,爲什麼在處理請求時不能處理它,並讓PUT方法只將用戶實體作爲參數?我是否錯過了任何東西,或者我對這種設計的理解完全錯誤?有什麼想法或意見嗎?

回答

1

有幾個原因。

首先,這是URI參數如何處理和匹配以便一次輸入一個變量的技術限制。這同樣適用於鍵/值編解碼器,所以應該讓你有一個用戶對象。但是當你使用json編解碼器時,我們會得到一個完整的對象,這樣最終會覆蓋用戶。

第二個是我從來沒有試圖解決這個問題,主要是因爲結合uri參數和響應主體導致一大堆隱藏的安全問題,你可能想保持清楚。

最後但並非最不重要的是,從建模的角度來看,ReST API應該使用URI作爲標識符和鏈接而不是外鍵,所以如果你已經有了標識符(URI),那麼爲什麼應該建模它你的實體。

+0

你的解釋很有道理,可能是我忽略了其他情況。 – JPReddy