簡體   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