我知道在MVC模式和REST服务中,使用像/items/{id}
这样的URI是很常见的,但是在URI中使用查询参数有什么坏处呢?
GET /items/{id}
vs GET /items?id={id}
此外,假设一个实体有一个指向某个相关实体(比如父实体)的'referenceId‘字段,我需要创建REST服务来获取父实体的所有项,哪种方式更好:
GET(POST) /items/parent/{parentId}
或
GET(POST) /items?parent={parentId}
我将非常感谢我的见解,这将有助于解决我在为REST服务构建URL方面的主观问题。
发布于 2013-01-16 01:52:01
我将使用以下方案。
/items/id
这唯一地寻址id为id
的项的资源。我们没有使用参数作为参数来唯一地寻址此资源(与其他选项一样)。就像miguelcobain建议的那样。
/parent/id/items
这里,id
是唯一寻址父资源的id,我们从这些id中收集/检索它引用的项。从您在问题中所说的情况看,父项似乎引用了多个项,比如容器或集合。
我使用的惯例是从左到右缩小范围。因此,在项目可以是active
或inactive
的情况下。因此,项的属性或属性为active
或inactive
。在此基础上,我得到了以下方案:
/items/active
/parent/id/active
发布于 2013-01-16 02:10:48
关于你的第一个问题:
/items/{id}
应该检索具有指定id的单个资源,如果资源不存在,则检索404
。
/items/?id={id}
应该检索一个数组(即使数组中只有一个数组),因为您正在查询集合。
关于你的第二个问题:
我同意@miguelcobain的评估-如果项目是特定的资源/实体,只需使用适当的资源路径来检索它。
要使使用者更容易执行此操作,请使用rel="parent"
和/或在子资源中包含uri来创建一个link header。有关链接头的示例,请参阅GitHub的pagination api。
发布于 2013-01-16 01:38:47
当然,REST原则并不关心URL的美学细节。它只是强制要求每个资源都应该是唯一可寻址的。
此外,使用查询参数来唯一地寻址某种“某种”东西违反了“参数”的语义,不是吗?参数应该是可选的、附加的和参数化的。例如,类似于对项目集合的详细搜索。
你写的东西在某些情况下可能是有意义的。那得看情况。
在你的例子中,真的是一个资源吗?如果没有,你可以直接使用GET(POST) /parents/{parentId}
。
比方说,如果parent
是一个布尔值,并且您想搜索parent等于true的项,那么使用参数是有意义的。但由于您明确表示需要一个具有特定id的父对象,因此我假设父对象本身就是一个资源,我将使用您的选项1对该资源进行唯一寻址。
我希望我说得很清楚了。
https://stackoverflow.com/questions/14342835
复制相似问题