如何避免在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)
{
...
}
这显然不起作用,因为签名是相同的。对此,建议采取什么方法?
如果您想要遵循标准的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。是的,这涉及到一些开销,所以你必须自己决定这个解决方案是否适合你。