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