RESTful - 按所有者ID获取资源列表

时间:2014-07-01 22:44:00

标签: c# .net rest asp.net-web-api

我需要获得属于特定部门的部门列表。根据REST基础知识,/dept/1 URL应该用于按ID获取特定部门,因此不能在此处使用。

然后我有以下选择:

/dept/division/1

看起来不像真正的REST。另外,我不知道如何在WebApi动作术语中实现它。

/dept?divId=1

看起来更RESTful。这将需要创建Get(int divId)操作,但还有Get(int id)用于检索单个部门且具有相同签名的操作。

/dept (with divId=1 in the body)
它足够RESTful吗?它会像#2中那样具有相同的签名问题但是......

请建议哪种方式更好。谢谢!

2 个答案:

答案 0 :(得分:3)

我该怎么做

/divisions/1/depts

/divisions/1获得ID为1的单一部门,后面的/depts获得属于该特定部门的所有部门

这当然可以扩展到

/divisions/1/depts/234

获得第234分部的ID 234的部门。

没有必要以这种方式通过身体传递信息。

我使用复数作为资源名称,因为我曾经这样做过,如果你想使用divisiondept,那就没关系。

答案 1 :(得分:2)

public class DivisionsController : ApiController
{
    [Route("/Divisions/{id}")]
    [HttpGet]
    public Division GetDivision(int id)
    {
        return // your code here
    }

    [Route("/Divisions/{id}/Dept")]
    [HttpGet]
    public IEnumerable<Department> GetDepartments(int id)
    {
        return // your code here
    }

    [Route("/Divisions/{id}/Dept/{deptId}")]
    [HttpGet]
    public Department GetDepartment(int id, int deptId)
    {
        return // your code here
    }
}

或者以更简洁的方式

[RoutePrefix("/divisions/{id}")]
public class DivisionsController : ApiController
{
    [Route]
    [HttpGet]
    public Division GetDivision(int id)
    {
        return // your code here
    }

    [Route("Dept")]
    [HttpGet]
    public IEnumerable<Department> GetDepartments(int id)
    {
        return // your code here
    }

    [Route("Dept/{deptId}")]
    [HttpGet]
    public Department GetDepartment(int id, int deptId)
    {
        return // your code here
    }
}