如何避免在RESTful Web API 2中做不同事情的相同操作

本文关键字:操作 何避免 RESTful Web API | 更新日期: 2023-09-27 18:26:44

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

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)
  {
     ...
  }

这显然不起作用,因为签名是相同的。对此,建议采取什么方法?

如何避免在RESTful Web API 2中做不同事情的相同操作

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

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

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

阅读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。是的,这涉及到一些开销,所以你必须自己决定这个解决方案是否适合你。