我不愿意张贴这一点,因为我觉得这是不是一个真正的解决方案,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请给我一个帮助。谢谢! –