2014-10-30 67 views
1

我正在研究一個非常簡單的電子商務應用程序,其中UI/html通過一組RESTful API與服務器對話(ASP.NET Web API,具體而言) 。如何爲非資源實體設計REST API

正確執行REST時,API會公開資源。在使用我的域對象(例如Product,User等)時,這很有效。

但是有一些功能不遵循此模式。比如說,當用戶輸入一個訂單號時,我想檢查這是否是一個有效的訂單號。現在我可以在訂單API上做一個簡單的GET並返回無效訂單

GET http://myhost.com/api/orders/SomeOrderNumber -> http 404 

但是它是否正確嗎?如果我想返回錯誤代碼和消息,該怎麼辦? (這顯然不是訂單對象的一部分)

那些甚至不屬於我的域名的實體呢?例如我想根據一些參數和條件來驗證郵編。我真的不想要類似

GET http://myhost.com/api/postcodes/SomePostCode -> validation message 

如果我想獲得當前登錄的用戶數,應該公開什麼類型的API?如果有人能指點我以前的帖子或有用的文檔,那會非常有幫助。

回答

1
  1. GET無法正確返回空響應。即使是空的答覆也意味着204 No Content狀態。您應該返回404 Not Found,您可以解釋錯誤消息正文中爲何該訂單號無效。

  2. 某個實體是否屬於您的域的一部分,對客戶應該是透明的。再一次,你描述的例子是正確的方法。

  3. 要返回當前登錄用戶的數量,您需要將會話狀態存儲在服務器上,並且這樣做首先不會成爲RESTful。您可能希望有一個可以通過查詢過濾的集合資源,並且您可以在上次查看用戶時進行過濾。例如:

    GET /api/users?last_seen_since=2014-10-31 0:00:00

,並在響應你可以指出查詢的總大小元數據字段或標題。

+0

感謝您的回答佩德羅。 [1]我的意思是隻有404,但寫了null!我的壞,現在編輯。你可以舉一個非常簡短的例子來說明在無效/未發現資源情況下的http響應嗎?帶有錯誤消息正文。 [3]這似乎是合理的。 – 2014-10-31 04:16:59

1

儘管它的一箇舊帖子,仍然想發佈我的評論,因爲它可能會幫助其他人。

我們在我們的項目中做的是,我們創建了EntityResultModel作爲所有請求的返回類型。

/// <summary> 
    /// Entity Result Model 
    /// </summary> 
    public class EntityResultModel 
    { 
     /// <summary> 
     /// Gets or sets a value indicating whether this instance is success. 
     /// </summary> 
     /// <value> 
     /// <c>true</c> if this instance is success; otherwise, <c>false</c>. 
     /// </value> 
     public bool IsSuccess { get; set; } 

     /// <summary> 
     /// Gets or sets the message. 
     /// </summary> 
     /// <value> 
     /// The message. 
     /// </value> 
     public string Message { get; set; } 

     /// <summary> 
     /// Gets or sets the result data. 
     /// </summary> 
     /// <value> 
     /// The result data. 
     /// </value> 
     public object ResultData { get; set; } 
    } 

所有的WebAPI請求將返回此EntityResultModel的對象,並使用這個對象,你可以,如果請求是成功還是驗證不,你甚至可以填充消息,如果需要在數據屬性還返回數據。