【发布时间】:2023-03-18 02:35:02
【问题描述】:
我正在创建一个 REST API,并且我有,例如,作者和帖子。
所以我可以通过以下方式获取作者发布的帖子:
/authors/123/posts
或者
/posts?authorId=123
我认为构建灵活的 API 可能是更好的选择。要获得作者的帖子,我会这样做:
/posts?authorId=123&published=true&sort=created&expand=tags,category
所以在这种情况下,我会从 authorId=123 获取所有发布的帖子,按创建日期对它们进行排序,并获取每个帖子的标签和类别。
基本上,我创建了一种映射到每个数据库表的查询语言。
然后对于常见的查询,我创建特定的端点:
/posts/recent
将独立于作者返回最近的帖子...
我认为/authors/123/posts 在使用多个级别时可能会变得复杂。
你怎么看?
更新
经过几个回答,我的想法如下:
当帖子和作者是我将拥有的两个资源时(例如帖子):
GET /posts?authorId=123&published=true
POST /posts
PUT /posts
DELETE /posts/123
如果帖子和作者之间存在分层依赖关系,并且我经常需要作者的帖子,我还会添加以下内容:
GET /authors/123/posts&published=true
如果帖子在资源作者之外不存在,则前面的 2 个选项将替换为:
GET /authors/123/posts?published=true
POST /authors/123/posts
PUT /authors/123/posts
DELETE /authors/123/posts/123
你怎么看?
【问题讨论】:
-
您可以使用属性路由使您的 Web API 变得灵活,请参阅 asp.net/web-api/overview/web-api-routing-and-actions/… 和 asp.net/web-api/overview/web-api-routing-and-actions/…
-
是的,我正在使用 AttributeRouting。问题是哪种方法更好?或者两者兼而有之?
-
选择属性路由,因为它使您可以使用单个控制器方法定义更多路由,从而使其灵活。
-
“我认为 /authors/123/posts 在使用多个级别时可能会变得复杂。” /authors/123/posts 是一个资源的唯一标识符(这是某个作者的所有帖子的列表),您不需要更高级别。如果您想进一步过滤结果,您将使用查询参数,即
/authors/123/posts?tags=cat,dog仅显示来自该用户的帖子。 ``/authors/123/posts/tag/cat` 在这种情况下没有多大意义,因为标签不是作者的资源,所以它不会得到任何“更大、更深”等。 -
至于使用
/authors/123/postsvs/posts?authorId=12,这取决于使用情况。如果您正在创建帖子搜索服务(即博客上的搜索框),那么/posts?authorId=12是有意义的,因为您的意图是查询所有帖子(有或没有用户约束)。但是,如果您有一个用户列表(配置文件)并且想要创建一个显示所有这些使用帖子的链接,您可以使用/authors/123/posts,因为它更能表达它的用法。您可以在您的休息服务中使用这两种服务,一种用于搜索,另一种用于作为其个人资料或用户信息中的链接
标签: angularjs api asp.net-web-api asp.net-core