我正在尝试编写2个Rest GET方法。
我需要知道是否有任何资源命名约定。我的 id 和用户名都是字符串。
我想出了:
/api/{v}/users/{userid}
/api/{v}/users/username/{username}
然而,2)看起来不正确,如果我将2)更改为/api/{v}/users/{username}
,我将映射到1),因为id和username都是字符串。或者使用/api/{v}/userbyName/{username}
?
在案例2中我应该如何命名我的资源路径?
答案 0 :(得分:3)
首先:https://vimeo.com/17785736(15分钟即可解决您的所有问题)
什么是独特的?用户名是唯一的还是只有id或两者都是唯一的?
所有这一切都有一个简单的规则:
/collection/item
然而,2)似乎不正确,如果我将2)更改为/ api / {v} / users / {username},我将映射到1),因为id和username都是字符串。
如果您的商品可以使用id
以及unique username
来识别 - 无论是用户名还是ID都无关紧要 - 只需查找两者(当然您的后端需要处理它并检索它。
根据您的需要,这是正确的:
/api/{v}/users/{userid}
/api/{v}/users/{username}
但我会选择仅使用:/api/{v}/users/{userid}
并仅使用用户名过滤查询参数(下面的描述)
如果我想出来,我也会违反任何规则 / API / {V} / userbyName / {用户名}
是 - /api/{v}/userbyName/{username}
将打破关于/collection/item
的规则,因为userByName显然不是一个集合,它将是一个函数 - 但是真正的宁静思考api路径中没有任何功能。
通过名称获取用户的另一种方式将使用过滤器/查询参数 - 因此ID可用于PathParameter,用户名仅可用作过滤器。这看起来像这样:
/api/{v}/users/?username={username}
这也不违反任何规则 - 因为查询参数只是过滤整个集合,只检索username = username的那个。
在案例2中我应该如何命名我的资源路径?
你的2)会违反规则 - 所以我不能/不会建议你这样做。
看看这个:https://vimeo.com/17785736这个简单的演示文稿将帮助你理解休息。
你为什么这样走?
曾经看过像 javascript框架一样 - 让我们说 ember 。 (Ember Rest-Adapter)。如果您遵循那里描述的想法,也许还可以看看ember和他们的其他适配器使用的json格式 - 您可以让您的前端开发人员加快他们的流程并节省大量资金和时间。
答案 1 :(得分:1)
通过REST,您可以发送回链接,其中包含URI模板。例如:/api/{v}/users/{userid}
在您的情况下,其中v
和userid
是模板变量。由于URI结构与客户端角度无关,因此您可以使用所需的任何结构。 OFC。使用好的和短的URI更方便,因为用它们编写路由更容易。
根据URI标准,路径包含层次结构,而查询包含URI的非层次结构部分,但这只是一个松散约束,实际上ppl使用两者。
/api/{v}/users/name/{username}
/api/{v}/users/name:{username}
/api/{v}/users?name="{username}"
OFC。您可以使用自定义约定,例如我使用以下内容:
所以在你的情况下我的解决方案是
/api/{v}/user/
/api/{v}/user/name:{username}
/api/{v}/user/{userid}
和
/api/{v}/user/?firstName="John"
/api/{v}/user/?firstName="John|Susan"&birthYear="1980-2005"
或
/api/{v}/user/firstName:John/
/api/{v}/user/firstName:John|Susan/birthYear:1980-2005/
等...
但那只是我自己的约束。
答案 2 :(得分:0)
每个资源都应该有一个唯一的URI。
GET /users/7
{
"id": 7,
"username": "jsmith",
"country": "USA"
}
查找满足某个谓词的用户应该使用查询参数。
GET /users?username=jsmith
[
"/users/7"
]