如何在Node.js中获取URL作为参数?

时间:2017-04-07 14:38:52

标签: javascript node.js express

CODE:

app.get("/:url", function(req,res) {
    var url = req.params.url;
    res.send(url);
});

问题:

这不起作用。

如果我尝试:

http://localhost:3000/https://www.google.com

我明白了:

Cannot GET /https://www.google.com

2 个答案:

答案 0 :(得分:2)

您可以使用正则表达式尝试此操作:

var app = require('express')();

app.get(/^\/(.*)/, function (req, res) {

    var url = req.params[0];
    res.send(url);

});

app.listen(3000, () => console.log('Listening on 3000'));

当你跑步时:

curl http://localhost:3000/https://www.google.com

服务器应该返回:

https://www.google.com

更新

关于冒号在URL中是否合法存在争议。

有关详细信息,请参阅此问题:

根据RFC 3986,这是一个合法的网址:

http://localhost:3000/https://tools.ietf.org/html/rfc3986

但请注意,虽然这也是合法的:

http://localhost:3000/https://tools.ietf.org/html/rfc3986#section-3.3

如果您在浏览器中输入了该网址,则您的服务器只会获得:

/https://tools.ietf.org/html/rfc3986

在请求中。出于这个原因,虽然不是绝对必要,但我仍然建议对您在其他网址中放置的网址进行网址编码 - 请参阅 Zac Delventhal 的答案。

实验

使用上面的代码示例,这个命令:

curl http://localhost:3000/https://www.google.com/

将输出:

https://www.google.com/

但是这个命令:

curl 'http://localhost:3000/https://www.google.com/#fragment'

将输出:

https://www.google.com/

请注意,我使用上面的单引号不是因为它们在这里是必要的 - 它们不是,请参阅:

echo http://localhost:3000/https://www.google.com/#fragment

但是为了表明哈希片段没有消失,因为它被shell视为注释,以防有人认为这可能是原因。即使使用引号也不会发送,并且可以使用-v的{​​{1}}开关来演示会发生什么:

curl

正如您所看到的,甚至没有使用HTTP发送散列片段,因此您的服务器甚至无法知道它是否存在。

顺便提一下,这也表明在其他网址中使用未经编码的网址不会弄乱任何代理,因为对代理服务器的HTTP请求会发送此信息:

* Connected to localhost (127.0.0.1) port 3000 (#0)
> GET /https://www.google.com/ HTTP/1.1
> User-Agent: curl/7.35.0
> Host: localhost:3000
> Accept: */*

而不是这个:

GET https://www.google.com/ HTTP/1.1

所以他们不能混淆。 (注意斜线。)

答案 1 :(得分:2)

这是因为:/是构造网址时使用的特殊字符。换句话说,它们不是 url-safe 。如果要将这些字符作为URL路径的一部分发送,使用默认的Express param解析器,则必须percent-encode

使用现有代码尝试此操作:

curl http://localhost:3000/https%3A%2F%2Fwww.google.com

你应该回来:

https://www.google.com

另一种选择是使用查询参数而不是路径变量。稍微修改您的代码段:

app.get("*", function(req, res) {
    var url = req.query.url;
    res.send(url);
});

然后,您可以使用以下命令对其进行测试:

curl http://localhost:3000?url=https://www.google.com

你应该回来:

https://www.google.com

虽然我会说对这些字符进行百分比编码仍然是一个好主意,即使Express可以这样解析它们。它可能会导致奇怪的行为。

另一种选择是将url作为字符串发送到POST请求的正文中,但根据您的使用情况,这可能不是RESTful。