我正在设计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)
{
...
}
由于签名是相同的,这显然不起作用。建议的方法是什么?
答案 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。是的,有一些开销,所以你必须自己决定这个解决方案是否适合你。