我不願意張貼這一點,因爲我覺得這是不是一個真正的解決方案,OP的問題。對我來說這是一個破解,所以使用它需要您自擔風險。
首先,REST網址中包含特殊字符(如'#')是非常規的。雖然我相信沒有標準的端點命名方式,但建議確保URL遵循這些規則;
- 所有小寫(因爲URL是不區分大小寫)
- 沒有特殊字符
- 沒有駱駝
不管怎樣,我的做法是。
關於服務器代碼;
- 假設你正在定義一個路徑
/config#
,那麼用'#'字符替換一些獨特的東西。 _bbb
夠獨特嗎?你判斷,只要確保它不與其他端點衝突。
- 添加一個快速圖層來解碼URL的特殊字符,並用您在第1點給出的唯一字替換特殊字符(當您看到代碼時,這將更加清晰)。
客戶端代碼:
- 編碼的URL。爲什麼?由於URL不能包含'#',因爲它是一個保留字符。所以它必須被編碼爲'%23'。
實施例:
客戶:
"use strict";
let request = require("request");
let req = {
url: `localhost:4444/${encodeURIComponent('config#')}`,
proxy: 'http://localhost:4444',
method: 'GET',
headers: {
'Content-Type': 'application/json'
}
};
request(req, function (err, res, body) {
this.config = JSON.parse(body);
console.log("response => " + this.config);
});
服務器:
"use strict";
var express = require("express");
var bodyParser = require("body-parser");
var app = express();
var config = require('config');
app.use(bodyParser.json());
app.use((req, res, next) => {
let decoded_url = decodeURIComponent(req.url);
req.url = decoded_url.replace('#', '_bbb');
next();
});
app.get('/config_bbb', function(req, res){
res.json('{name: test}');
});
// Start the server
app.set('port', 4444);
app.listen(app.get('port'), "0.0.0.0", function() {
console.log('started');
});
輸出:
響應=> {名稱:測試}
這裏的想法是。當客戶端調用端點時,是的,URL仍然是/config#
,但是您對它進行編碼,使其看起來像/config%23
。
參見:
http://www.w3schools.com/tags/ref_urlencode.asp
然後,當請求通過到服務器,您在expressJS加層將網址從/config%23
解碼爲/config#
和更換#
燒焦的東西獨特。比如說_bbb
,這樣最終的URL是/config_bbb
,它被路由到實際的端點。
不幸的是,express不喜歡端點有特殊字符,如果你沒有將#
替換成可識別的東西,那麼你會發現它不能正確路由它,即使你的URL匹配。
URL哈希('#xxxxx')沒有被髮送到服務器,它只被瀏覽器使用。與角度無關......只是散列的工作原理 – charlietfl
在端點名稱中包含特殊字符值是很常見的。爲了簡化事情 - 你應該可以在expressJS中間件中添加一個'layer'來將'#'轉換爲某個東西,一個獨特的詞或者什麼。然後相應地註冊您的端點。如果你不介意,我可以用我的想法作爲你的答案。 –
@SamuelToh請給我一個幫助。謝謝! –