繁体   English   中英

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

[英]How to get a url as a param in Node.js?

码:

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

您可以使用正则表达式进行尝试:

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

如果您在浏览器中输入该URL,则服务器将仅获得:

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

在请求中。 因此,尽管并非绝对必要,我仍然建议您对其他URL中放置的URL进行URL编码-请参阅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会将其视为注释。 即使使用引号,也不会发送该消息,可以通过curl-v开关演示发生了什么:

* 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: */*

如您所见,哈希片段甚至没有通过HTTP发送,因此您的服务器甚至都无法知道它的存在。

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

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

而不是这样:

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

这样就不会感到困惑。 (请注意斜杠。)

这是因为:/是构造URL时使用的特殊字符。 换句话说,它们不是url-safe 如果要使用默认的Express参数解析器将这些字符作为URL路径的一部分发送,则必须对其进行百分比编码

尝试使用您现有的代码:

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的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM