什么是RESTful方式来设计返回子资源父资源的URL?

什么是RESTful方式来设计返回子资源父资源的URL?,rest,http,asp.net-core,Rest,Http,Asp.net Core,我正在为博客REST API建模,该API具有以下URL的资源Blog、Post和Comment: /api/blogs /api/blogs/{blogId} /api/blogs/{blogId}/posts 我为中的所有Posts及其注释创建单独的端点: /api/posts /api/posts/{postId} /api/posts/{postId}/comments 既然我有postId,那么对于特定的Post,用什么RESTful方式获取Blog?我有三个想法: 1. /api

我正在为博客REST API建模,该API具有以下URL的资源
Blog
Post
Comment

/api/blogs
/api/blogs/{blogId}
/api/blogs/{blogId}/posts
我为中的所有
Post
s及其注释创建单独的端点:

/api/posts
/api/posts/{postId}
/api/posts/{postId}/comments
既然我有
postId
,那么对于特定的
Post
,用什么RESTful方式获取
Blog
?我有三个想法:

1. /api/posts/{postId}/blog
2. /api/blogs/parent-of-post/{postId}
3. /api/blogs?postId={postId}
对我来说,
1.
URL看起来更“漂亮”,但
2.
选项看起来更“合理”,因为该端点(例如,
/api/blogs/*
)通常用于博客资源

第三个选项使用查询字符串作为参数,但我遇到的问题是,该端点将根据参数返回不同类型的主体。例如,如果没有参数
/api/blogs
则返回
Blog
资源的集合,而使用参数
posted
则只返回
Blog
的单个实例。我不确定这是否是一件好事(特别是因为我使用的是ASP.NET Core和C#,它具有强类型的返回对象,所以实现可能会比较麻烦)

什么是RESTful方式来获取特定帖子的博客

真正的答案:任何你想要的

不在乎资源标识符使用什么拼写约定。只要您的标识符符合所描述的生产规则,您就可以开始了


这是一个非常正常的选择,当您想要使用通用web浏览器时,这是一个非常方便的选择,因为HTML表单已经有了标准,可以轻松地使用此形状创建URI

你的另外两个选择很好;它们对HTML表单不友好,这一点就不重要了,但使用一个


第三个选项使用查询字符串作为参数,但我遇到的问题是,该端点将根据参数返回不同类型的主体

通用API使用者不会仅仅因为两个资源的标识符的拼写相互重叠就认为这两个资源是相同的

也就是说,从外部来看,两者之间没有隐含的关系

/api/blogs
/api/blogs/1
/api/blogs?postId=2
因此,对于一般用途的消费者来说,他们返回不同的身体这一事实并不令人惊讶

现在,您的路由框架可能不支持从这些资源的处理程序返回不同的类型(或者,更可能的是,可能没有任何“好”的方法来自动执行路由),但这是一个故意隐藏在RESTAPI外观后面的实现细节

类似地,阅读您访问日志的人可能更喜欢一种拼写而不是另一种,以减少他们自己的认知负荷。

您可以实现以下功能。遵循此规范将意味着您的
Post
响应负载有一个
\u links
元素,该元素包含相关的导航链接(父链接、自链接、注释)
/api/blogs
/api/blogs/1
/api/blogs?postId=2