【发布时间】:2018-01-13 09:56:45
【问题描述】:
我进行了谷歌搜索,但找不到我真正需要的东西。 我需要查询一个 API,它具有相同的路由,但具有不同的参数。
例子:
router.get('/items/:query, function(){})
在这种情况下,我会搜索所有项目
router.get('/items/:id, function(){})
在这里,我会寻找一个特定的项目
【问题讨论】:
我进行了谷歌搜索,但找不到我真正需要的东西。 我需要查询一个 API,它具有相同的路由,但具有不同的参数。
例子:
router.get('/items/:query, function(){})
在这种情况下,我会搜索所有项目
router.get('/items/:id, function(){})
在这里,我会寻找一个特定的项目
【问题讨论】:
问题在于,如果没有额外的模式匹配,Express 将无法区分 /items/:query 和 /items/:id,它们是相同的路由模式,只是参数的别名不同。
根据您打算如何构建查询,您可能需要考虑使用路由 /items,然后使用查询字符串参数或使用单独的 /items/search/:query 端点。
【讨论】:
问题的核心是您试图在同一位置指定两个不同的资源。如果你设计你的 API 来遵守宁静的原则,你就会明白为什么这不是一个明智的选择。这里有两个很好的起点:
https://en.wikipedia.org/wiki/Representational_state_transfer
http://www.restapitutorial.com/lessons/whatisrest.html
在restful api中,根资源代表项目集合:
/api/items
...当您指定一个表明您只想要一个项目的 id 时:
/api/items/abc123
如果您仍然想完成您在问题中提出的问题,您需要添加一个 url 参数,例如 /items/query?query=true 或 /items/abc123?detail=true 但这会让 99 感到困惑看过您的代码的网络开发人员百分比。
另外我不确定你是否真的是这个意思,但是当你将一个名为“查询”的变量传递给服务器时,这似乎表明你将要发送一个 SQL 查询(或类似的数据定义语言)客户端进入服务器。出于多种原因,这是一种危险的做法 - 最好将所有此类代码留在您的服务器上。
编辑:如果您真的绝对肯定必须这样做,那么可能有一个查询参数显示 ?collection=true。这至少会被将来可能必须维护代码的其他开发人员理解。还要确保添加 cmets 来解释为什么你无法实施休息,这样你就不会留下坏名声:)
【讨论】: