【问题标题】:How to prevent use of conflicting keywords in REST api calls in Express如何防止在 Express 的 REST api 调用中使用冲突的关键字
【发布时间】:2015-07-09 15:12:12
【问题描述】:

如果我正在为应用程序创建一个带有 express 的 REST api,据我所知,路由定义的顺序很重要。例如,如果我按以下顺序编写路线:

app.get('/users/:username', user.get);
app.get('/users/list', user.listAll);

然后 user.listAll 永远无法到达,当向“/users/list”发出请求时,服务器会将“list”分配给用户名参数。所以很明显你想要颠倒这些路由的声明顺序。但是在这里,如果用户使用用户名“list”创建帐户,我们会遇到同样的问题,对吧?

那么如何防止用户使用“关键字”创建名称,其中关键字在此处定义为与 api 路由冲突的字符串。

我可以想到两种方法,但似乎都不令人满意。首先,您可以保留与每个用户名创建进行比较的字符串黑名单。但维持这将是一场噩梦。第二,只需在数据库中预先创建这些用户(只要用户名是唯一的)。这种看起来有点老套,但我想不出很多反对它的论据。

这个问题有简单的解决办法吗?

【问题讨论】:

    标签: node.js api rest express


    【解决方案1】:

    好问题。我前段时间遇到过这个问题。您一定来自像我这样的网络背景,因为您正在尝试使用“slug”方法对 API 进行用户可读的调用。使用可读的 slug 非常棒,实际上是网站的首选!实际上,在 API 中没有一种方法可以做到这一点我见过很多可行的方法,但我只知道一种使其可扩展和描述性的方法,这种方法几乎适用于每个用例。

    始终使用 ID

    • 一个用户:/users/:id
    • 列表:/users/
    • 好友:/users/:id/friends
    • 1 个用户的 1 个朋友:/users/:id/friends/:id

    以上是可扩展的并且仍然是描述性的!另外我使用版本控制。 (例如:/v1/users)。这允许我将 API 升级到 v2,同时仍支持旧客户端 :)

    现在如何查找特定用户? 使用过滤器!..如何?

    /v1/users?username=:用户名

    以上将总是返回用户列表。如果用户名是唯一的,这仍然是一个列表,但只有 1 条记录或只是一个空列表。

    使用 HTTP 方法 POST PUT GET DELETE

    • 在 /users 上发布(201 个创建的用户)
    • PUT/DELETE on /users(不允许使用 400 方法)(可以选择全部删除???不推荐)
    • 在 /users/:id 上放置/删除(200 成功)
    • 在 /users/:id 上发布(400 个用户已存在)

    希望这能解决你的问题:)

    【讨论】:

    • 我喜欢这种方法,我会使用它。如果我理解正确,似乎我应该为(a)参数或(b)各种预定义的路径字符串保留第 n 个路径位置。在这种情况下,它是一个异或。由于字符串是预定义的,我只需要确保它们不会相互冲突,但是我可以在路径的第 n 个位置有尽可能多的变化。并为版本控制技术 +1。
    • 但是如果你想得到所有用户的所有朋友怎么办? /users/friends/ 并且...说管理员也有朋友(不是告诉我简单地得到/friends/) 真实案例:/devices/infos/ 和 /queues/infos/ 你不能 /infos/ ...啊啊
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    • 1970-01-01
    • 2017-11-22
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多