虽然不完全是RESTful,但我认为使用动作来执行更简单的数据操作更有意义。因此我采用了以下方案:
/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是正确的选项。我应该只返回项目列表吗?或者返回包含项目列表的客户端?
答案 0 :(得分:3)
我相信最RESTful的方式是:
GET: /api/clients/5/projects
这将返回标识为5
的客户的所有项目。
你也可以使用:
GET: /api/projects?clientId=5
如果调用者在请求客户端时可能会使用项目数据,则将其包含在结果中。否则,最好将它们作为单独的请求保留。
答案 1 :(得分:2)
你听说过OData吗?它扩展了基本的REST功能,并提供了标准化的查询格式。
例如:
按ID要求个人实体
以下请求将返回Person类型的单个实体 给予用户名“russellwhyte”
GET serviceRoot/People('russellwhyte')
http://www.odata.org/getting-started/basic-tutorial/
或者...
GET serviceRoot/Airports('KSFO')/Location/Address
在你的情况下,我或多或少会想到......
GET api/Clients('clientid')/Projects
正如user1620220所述 - Web API内置了对OData的支持: http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/supporting-odata-query-options