2015-02-05 63 views
1

儘管不完全是RESTful,但我認爲使用操作更有意義,因爲您在做的事情在概念上涉及更多,而不僅僅是操作簡單數據。因此,我已經採用了以下方案:Web API操作

/api/projects/ = Returns all projects 
/api/projects/{id} = Returns single project 

/api/projects/{id}/{action} [POST] 
     Applies action on a project, such as "Activate" 
/api/projects/{action} [GET] 
     Gets projects which meet the condition of the action, such 
     as all projects which are "Active" 

但是......提供了一種方式來獲得項目的客戶不是那麼清楚,我傾向於選擇2 ...

1. /api/projects/GetByClient [POST, Client Id in body] 
     But now it has to be a POST, when we're only getting a resultset... 
2. /api/clients/{clientid}/GetProjects 
     But now we're returning projects from a clients controller 
3. /api/ProjectGetterForClient/{client} 
     But will result in a large number of URLs for a complex project 

我應該如何使這種API可用?

如果#2是正確的選項。我應該只返回項目清單嗎?或者返回包含項目列表的客戶端?

回答

3

我相信最REST風格的方法是:

GET: /api/clients/5/projects 

這將返回所有項目的客戶端ID 5

您還可以使用:

GET: /api/projects?clientId=5 

如果你的來電者很可能時,他們要求客戶端使用的項目數據,然後將其包含在結果。否則,你最好把它們作爲單獨的請求。

+0

您對最後說「如果您可能使用項目數據...」的評論似乎指的是將「/ api/clients/5」作爲始終返回項目數據(即使未明確要求)。我在問題結尾處問的是,在使用/ api/clients/5/projects時,這些項目是否應該包裝在客戶端對象中?這樣,客戶端控制器仍然只是返回客戶端...我想不是,就好像您調用該url,您可能已經擁有客戶端對象的數據。只需尋找確認... – Lee 2015-02-06 09:16:13

+0

如果我調用了'/ api/clients/5/projects',那麼我會期望結果中的根對象是項目,而不是客戶端。實際上,您可以向您的項目控制器請求這樣的路由,您只需在默認的'api/{controller}/{id}'之前定義路由。 – user1620220 2015-02-06 13:17:13

+0

這正是我所做的 - 感謝您的幫助:) – Lee 2015-02-06 21:17:48

2

您是否聽說過OData?它擴展了基本的REST功能並提供標準化的查詢格式。

例如:

通過ID請求的個別實體

下面的請求由 給定用戶名「russellwhyte」

GET serviceRoot/People('russellwhyte') 

返回類型Person的單獨實體http://www.odata.org/getting-started/basic-tutorial/

還是......

GET serviceRoot/Airports('KSFO')/Location/Address 

你的情況,這可能是我想或多或少...

GET api/Clients('clientid')/Projects 

由於user1620220提到 - 網頁API內置了支持的OData: http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/supporting-odata-query-options

+2

另請注意,Web API [內建的OData支持](http://www.asp.net/web-api/overview/odata-support-在-ASPNET-Web的API /支撐用的OData查詢選項)。 – user1620220 2015-02-05 18:29:07

+0

我對OData一無所知,我沒有意識到Web API內置了對它的支持,但是我認爲它對於我的場景來說是過度的,我不需要(或者不是真的)那種級別的定製用戶可以控制。我仍然可以使用它進行排序,或者在單個級別進行基本篩選。感謝你的回答! – Lee 2015-02-06 09:19:44