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

如果我正在为应用程序创build一个REST API,那么就我所知,path定义的顺序很重要。 例如,如果我按照以下顺序编写我的路线:

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

那么user.listAll永远不会被访问到,并且当向/ users / list发出请求时,服务器会将“list”分配给username参数。 所以很明显你想要颠倒这些路线的声明顺序。 但是在这里,如果用户使用用户名'list'创build一个帐户,我们会遇到同样的问题,对吧?

那么如何防止用户使用“关键字”创build名称,这里的关键字定义为与api路由冲突的string。

我可以想到两种方法,但都不令人满意。 首先,你可以保留一个黑名单string,你比较每个用户名创build。 但保持这将是一场噩梦。 而且,只需在数据库中预先创build这些用户(只要用户名是唯一的)即可。 这种做法看起来有点不好意思,但我想不出有多less反对意见。

有没有简单的解决这个问题?

好问题。 我刚才遇到了这个问题。 你必须来自像我这样的网页背景,因为你正尝试使用'slug'方法来让用户可读的API调用。 使用可读的slu is是伟大的,实际上首选的网站! 实际上在API中没有办法做到这一点我已经看到了很多方法,但是我只知道一种使其几乎适用于所有用例的可扩展和描述性的方法。

始终使用ID的

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

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

现在我如何查找一个特定的用户? 使用filter! .. 怎么样?

/ V1 /用户名=:用户名

以上将始终返回用户列表。 如果用户名是唯一的,这仍然是一个列表,但只有一个logging或只是一个空的列表。

使用HTTP方法POST PUT GET DELETE

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

希望这会解决你的情况:)