rest - 网络 API/REST : Request list of items

标签 rest asp.net-web-api

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

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

http://MyService/Albums

http://MyService/Albums/12345

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 中是否已经存在快捷方式以及执行此操作的首选方法?我看过 Category=Blues&Category=Pop& 的一些建议 ..... 对我来说似乎很冗长,但如果有标准的话我想使用它。

(B) 当我使用我的方法时,我不断地在各处编写拆分代码。 REST 中是否有简化此操作的快捷方式?我看过一些 [FromUri] 引用资料,但我不清楚。

最佳答案

一个)。在精确推荐的方法上休息有点放松,基本上你有 3 个选项。没有一个比另一个更“RESTful”,选择最适合您的 API 用户的那个 - 这可能与适合您自己的不同,毕竟 API 用户也是用户:-)。

1).实现一个自定义 ActionFilter,这将使您免于拆分代码,请参阅有关此问题的多个答案 https://stackoverflow.com/a/19107738/1422377

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

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

public List<Album> GetAlbumsByCategory([FromUri] string[] categoryList)
{
  //your code here
}

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

关于rest - 网络 API/REST : Request list of items,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29927625/

相关文章:

javascript - restify.serveStatic 不处理默认文档

java - 客户计算机上的 Apache httpclient 超时(处理请求时捕获 I/O 异常 : Connection timed out

rest - 我应该如何使用 Keycloak 设置 "role-less"(ACL、ABAC)REST API 的授权?

java - 如何修复服务器返回 HTTP 响应代码 400 且无法处理转换的问题

查询字符串中的 RESTful API 必需参数?

c# - OData 无法识别我的集合属性

c# - 如何通过主键删除一条记录?使用 web api 2. 获取 404

c# - Entity Framework 创建重复的实体

entity-framework - 应用程序架构 mvc4 ef5

wcf - OperationContext.Current 的值不是此OperationContextScope 安装的OperationContext 值