Web API/REST:请求项列表

Web API/REST:请求项列表,rest,asp.net-web-api,Rest,Asp.net Web Api,我想这可能是一个简单的问题,但我看到了相互矛盾的答案 我正在构建一个返回类对象的RESTfulWebAPI服务。除了能够请求所有项目、一个项目或类似类别之外: 我还希望用户能够选择多个,例如: 我不需要上面显示的语法,这只是一个示例 我已经通过创建如下代码完成了这一点: [Route("Albums/Category/{categoryList}")] public List<Album> GetAlbumsByCategory(string categoryList) {

我想这可能是一个简单的问题,但我看到了相互矛盾的答案

我正在构建一个返回类对象的RESTfulWebAPI服务。除了能够请求所有项目、一个项目或类似类别之外:

我还希望用户能够选择多个,例如:

我不需要上面显示的语法,这只是一个示例

我已经通过创建如下代码完成了这一点:

[Route("Albums/Category/{categoryList}")]
public List<Album> GetAlbumsByCategory(string categoryList)
{
  int[] cats = categoryList.Split(',');
  return(AlbumManager.GetAlbums(cats));
}
[路线(“相册/类别/{categoryList}”)]
公共列表GetAlbumsByCategory(字符串类别列表)
{
int[]cats=categoryList.Split(',');
return(AlbumManager.GetAlbums(cats));
}
这很好,但用户需要知道输入可以是单个值,也可以是逗号表示的值列表。然后,在我的AlbumManager中,我将遍历唱片集,并仅将所选项目添加到新列表中

我想知道:

(A) REST中是否已经有了捷径以及实现这一点的首选方法?我看到了一些关于Category=Blues和Category=Pop的推荐。。。。。对我来说似乎冗长,但如果有一个标准,我想使用它

(B) 当我使用我的方法时,我总是到处写拆分代码。在REST中是否有简化此操作的捷径?我看过一些[FromUri]参考资料,但我不清楚。

a)。Rest在推荐的方法上有点放松,基本上你有3个选择。其中没有一个比另一个更“RESTful”,请选择最适合您的API用户的一个-这可能不同于适合您自己的,毕竟所有API用户也是用户:-)

1) 。实现一个自定义的ActionFilter,它将把您从拆分代码中解救出来,请参阅此问题的多个答案

2) 。听起来“违背原则”,发送一个POST请求,接受来自主体的列表。是的,最纯粹的人可能会争辩说,除非你修改数据,否则这不应该构成帖子,但要记住用户

3) 。稍微修改您当前的方法,使API用户更清楚地了解他们期望输入的内容。例如:

public List<Album> GetAlbumsByCategory([FromUri] string[] categoryList)
{
  //your code here
}
公共列表GetAlbumsByCategory([FromUri]string[]categoryList)
{
//你的代码在这里
}

就个人而言,在您的情况下,我会选择选项3——尽管详细的语法对于任何API用户来说都很熟悉,然后是选项1。如果您有更复杂的输入模型,请使用选项2。正如我所说,没有一个比另一个更安静

谢谢你的回答。如果我读对了,听起来好像虽然我的方法没有错误,REST也不是非常严格,但它不属于推荐的3种方法之一。我想我更喜欢3,尽管正如你所说,它是冗长的。最后一个关注点/问题,如果他们想要查询数千个项目(这对我来说是一个真实的场景),该怎么办?我想他们可能需要将其拆分为查询字符串长度友好的批处理来获取,或者我必须使用POST方法。@enforge如果您需要数千人的支持,您将被迫使用POST,否则您可能会达到GET请求url的上限,如前所述