[英]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.