如何避免在RESTful Web API 2中执行不同操作的相同操作?

时间:2015-12-14 08:29:01

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

我正在设计RESTful Web API并遇到以下问题:我需要一个控制器来检索层次结构的集合(称为Sections)以及检索单个部分(a单节)。如果我需要一个集合,我必须引用根节的ID,它给出了整个结构的子树。所以我继续并定义了一个像这样的SectionsController:

public class SectionsController : ApiController
{
  // GET api/sections/5
  // Gets a subtree.
  public IEnumerable<Section> Get(int rootId)
  {
     ...
  }

  // GET api/sections/5
  // Gets a single section.
  public Section Get(int sectionId)
  {
     ...
  }

由于签名是相同的,这显然不起作用。建议的方法是什么?

2 个答案:

答案 0 :(得分:3)

如果您想遵循标准的REST模式,您应该引入稍微不同的API:

public class SectionsController : ApiController
{
  // GET api/section
  public IEnumerable<Section> GetAll()
  {
     ...
  }

  // GET api/section/5
  public Section Get(int sectionId)
  {
     ...
  }

通常,您应该使用单一资源,并仅为特定资源提供标识符。即使使用不同的控制器,您也无法拥有相同的URL。

答案 1 :(得分:0)

阅读关于图像传输的this post on SO并按照提供的链接,我意识到这个问题有一个非常简单的解决方案,它尊重REST,同时不需要额外的控制器。

只需返回特定ID所请求对象中的子树ID集合,即

public class Section
{
   public int Id { get; set; }
   public string Name { get; set; }
   public int[] DescendantIds { get; set; }
}

只需拨打一次

即可
api/section/5

我获取ID为5的部分的所有详细信息以及以下部分的ID。是的,有一些开销,所以你必须自己决定这个解决方案是否适合你。