我想这可能是一个简单的问题,但我看到的是相互矛盾的答案。
我正在构建一个返回类对象的restful web api服务。除了能够请求所有项目,一个项目或类别,如:
http://MyService/Category/Blues
我还希望能够让用户选择多个,例如:
http://MyService/Albums/12345,77777,87654
http://MyService/Category/Blues,Pop,Metal
我不需要上面显示的语法,这只是一个例子。
我已经通过创建代码来实现这一点:
[Route("Albums/Category/{categoryList}")]
public List<Album> GetAlbumsByCategory(string categoryList)
{
int[] cats = categoryList.Split(',');
return(AlbumManager.GetAlbums(cats));
}
这很好用,但用户需要知道输入可以是单个值,也可以是逗号的值列表。然后在我的AlbumManager中,我正在遍历相册集并仅将所选项添加到新列表中。
我想知道:
(A)REST中是否已有快捷方式以及这样做的首选方式?我见过一些类别= Blues&amp; Category = Pop&amp; amp; .....对我来说似乎很冗长,但如果有标准,我想用它。
(B)当我使用我的方法时,我总是在整个地方编写分割代码。 REST中是否有快捷方式可以简化此操作?我看过一些[FromUri]参考文献,但我不清楚。
答案 0 :(得分:0)
A)。休息是一个有点放松的精确推荐的方式来做到这一点,基本上你有3个选项。其中任何一个都不再是“RESTful”,选择最适合您的API用户的那个 - 可能与您自己的套件不同,毕竟API用户也是用户: - )。
1)。实现一个自定义ActionFilter,它将为您节省拆分代码,请参阅此问题的多个答案https://stackoverflow.com/a/19107738/1422377
2)。听起来像“反对原则”,发送一个接受来自正文的List的POST请求。是的,最纯粹的人可能会争辩说,除非你修改数据,否则这不应该构成一个帖子,但要记住用户。
3)。稍微修改您当前的方法,以使API用户更清楚他们对输入的期望。例如:
public List<Album> GetAlbumsByCategory([FromUri] string[] categoryList)
{
//your code here
}
就个人而言,在你的情况下我会使用选项3 - 虽然详细说明任何API用户都会熟悉语法,然后是选项1.如果你有一个更复杂的输入模型,请选择选项2.正如我所说没有人比其他人更加RESTful。