如何防止在Express中的REST api调用中使用冲突的关键字

时间:2015-04-30 04:15:48

标签: node.js api rest express

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

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

然后永远无法访问user.listAll,服务器将分配' list'在向' / users / list'发出请求时使用username参数。因此很明显,您想要颠倒这些路线声明的顺序。但是,如果用户使用用户名'列表',那么我们会遇到同样的问题,对吧?

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

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

这个问题有一个简单的解决方案吗?

1 个答案:

答案 0 :(得分:3)

好问题。我刚才面对这个。您必须来自像我这样的Web背景,因为您正在尝试使用'slug'方法来对用户进行API调用。使用可读的slugs非常棒,在网站中实际上是首选!在API中实际上没有一种方法可以做到这一点我已经看到很多方法可行,但我只知道一种方法,使其可扩展和描述,几乎适用于所有用例。

始终使用ID

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

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

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

/ V1 /用户的用户名=:用户名

以上始终会返回用户列表。如果用户名是唯一的,那么它仍然是一个列表,但只有一个记录或只是一个空列表。

使用HTTP方法POST PUT GET DELETE

  • POST on / users(201创建的用户)
  • / users上的PUT / DELETE(不允许400方法)(可选择删除所有???不推荐)
  • PUT / DELETE / users /:id(200成功)
  • POST on / users /:id(400用户已存在)

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