REST资源路由命名为get和ResourceByID以及ResourceByName

时间:2015-04-17 20:59:21

标签: rest

我正在尝试编写2个Rest GET方法。

  1. 通过 ID
  2. 获取用户
  3. 通过 userName 获取用户。
  4. 我需要知道是否有任何资源命名约定。我的 id 用户名都是字符串。

    我想出了:

    1. /api/{v}/users/{userid}

    2. /api/{v}/users/username/{username}

    3. 然而,2)看起来不正确,如果我将2)更改为/api/{v}/users/{username},我将映射到1),因为id和username都是字符串。或者使用/api/{v}/userbyName/{username}

      是否可以接受

      在案例2中我应该如何命名我的资源路径?

3 个答案:

答案 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这个简单的演示文稿将帮助你理解休息。

enter image description here


你为什么这样走?

曾经看过像 javascript框架一样 - 让我们说 ember 。 (Ember Rest-Adapter)。如果您遵循那里描述的想法,也许还可以看看ember和他们的其他适配器使用的json格式 - 您可以让您的前端开发人员加快他们的流程并节省大量资金和时间。

答案 1 :(得分:1)

通过REST,您可以发送回链接,其中包含URI模板。例如:/api/{v}/users/{userid}在您的情况下,其中vuserid是模板变量。由于URI结构与客户端角度无关,因此您可以使用所需的任何结构。 OFC。使用好的和短的URI更方便,因为用它们编写路由更容易。

根据URI标准,路径包含层次结构,而查询包含URI的非层次结构部分,但这只是一个松散约束,实际上ppl使用两者。

  • /api/{v}/users/name/{username}
  • /api/{v}/users/name:{username}
  • /api/{v}/users?name="{username}"

OFC。您可以使用自定义约定,例如我使用以下内容:

  • 我不会使用多个资源名称
  • 我以斜线结束收集路径
  • 我通过将集合缩减为子集合或单个项目来使用斜杠
  • 我没有使用斜杠来给出路径中变量的值,而是使用冒号
  • 我尽可能少使用变量和短URI
  • 我通过将集合简化为子集合来使用查询,尤其是通过使用逻辑运算符定义复杂过滤器

所以在你的情况下我的解决方案是

  • /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"
]