我不愿意发布这个,因为我认为这不是 OP 问题的真正解决方案。对我来说,这是一个 hack,所以使用它需要您自担风险。
首先 - REST URL 中包含特殊字符(如“#”)是非常规的。虽然我认为没有标准的端点命名方式,但建议确保 URL 遵循这些规则;
- 全部小写(因为url不区分大小写)
- 没有特殊字符
- 没有骆驼案
无论如何,我的方法是。
关于服务器代码;
- 假设您正在定义路径
/config#,然后将“#”字符替换为独特的字符,例如_bbb 够独特吗?你判断,只要确保它不会与其他端点冲突。
- 添加一个 express 层来解码 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 中添加的层会将 URL 从 /config%23 解码为 /config#,并将 # 字符替换为独特的字符。假设_bbb,最终的 URL 是/config_bbb,它被路由到实际的端点。
不幸的是,express 不喜欢端点中包含特殊字符,如果您不将 # 替换为可识别的东西,那么您会发现即使 URL 匹配,它也无法正确路由。