2015-02-05 68 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