首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >REST URL命名约定/items/{id}与/items?id={id}

REST URL命名约定/items/{id}与/items?id={id}
EN

Stack Overflow用户
提问于 2013-01-16 01:01:01
回答 4查看 7.9K关注 0票数 9

我知道在MVC模式和REST服务中,使用像/items/{id}这样的URI是很常见的,但是在URI中使用查询参数有什么坏处呢?

GET /items/{id} vs GET /items?id={id}

此外,假设一个实体有一个指向某个相关实体(比如父实体)的'referenceId‘字段,我需要创建REST服务来获取父实体的所有项,哪种方式更好:

代码语言:javascript
运行
复制
GET(POST) /items/parent/{parentId} 

代码语言:javascript
运行
复制
GET(POST) /items?parent={parentId}

我将非常感谢我的见解,这将有助于解决我在为REST服务构建URL方面的主观问题。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-01-16 01:52:01

我将使用以下方案。

代码语言:javascript
运行
复制
/items/id

这唯一地寻址id为id的项的资源。我们没有使用参数作为参数来唯一地寻址此资源(与其他选项一样)。就像miguelcobain建议的那样。

代码语言:javascript
运行
复制
/parent/id/items

这里,id是唯一寻址父资源的id,我们从这些id中收集/检索它引用的项。从您在问题中所说的情况看,父项似乎引用了多个项,比如容器或集合。

我使用的惯例是从左到右缩小范围。因此,在项目可以是activeinactive的情况下。因此,项的属性或属性为activeinactive。在此基础上,我得到了以下方案:

代码语言:javascript
运行
复制
/items/active
/parent/id/active
票数 6
EN

Stack Overflow用户

发布于 2013-01-16 02:10:48

关于你的第一个问题:

/items/{id}应该检索具有指定id的单个资源,如果资源不存在,则检索404

/items/?id={id}应该检索一个数组(即使数组中只有一个数组),因为您正在查询集合。

关于你的第二个问题:

我同意@miguelcobain的评估-如果项目是特定的资源/实体,只需使用适当的资源路径来检索它。

要使使用者更容易执行此操作,请使用rel="parent"和/或在子资源中包含uri来创建一个link header。有关链接头的示例,请参阅GitHub的pagination api

票数 4
EN

Stack Overflow用户

发布于 2013-01-16 01:38:47

当然,REST原则并不关心URL的美学细节。它只是强制要求每个资源都应该是唯一可寻址的。

此外,使用查询参数来唯一地寻址某种“某种”东西违反了“参数”的语义,不是吗?参数应该是可选的、附加的和参数化的。例如,类似于对项目集合的详细搜索。

你写的东西在某些情况下可能是有意义的。那得看情况。

在你的例子中,真的是一个资源吗?如果没有,你可以直接使用GET(POST) /parents/{parentId}

比方说,如果parent是一个布尔值,并且您想搜索parent等于true的项,那么使用参数是有意义的。但由于您明确表示需要一个具有特定id的父对象,因此我假设父对象本身就是一个资源,我将使用您的选项1对该资源进行唯一寻址。

我希望我说得很清楚了。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14342835

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档