来自 express 的 GET 或 POST 不解析 "percent sign" 请求
GET or POST from express do not parse a "percent sign" request
我在解析使用“%26”而不是“&”字符的 HTTP 请求时遇到困难。
上下文:我正在尝试接收由 IP 摄像机发出的 HTTP 请求,该请求具有无法发送“&”字符的限制,因此我必须使用“%26”来设置它来分隔参数,所以相机正在发出这样的 POST 请求:
http://192.168.45.4:8000/test?foo=me%26bar=them
为了在我的服务器端处理这个请求,我有这个简单的函数:
Broker.all("*", (req,res) => {
console.log("foo=" + req.query.foo);
console.log("bar=" + req.query.bar);
console.log("Received a generic put request");
res.send("Processed");
});
当我使用“&”字符发出请求时,这段代码工作正常。
这是请求的结果:http://192.168.45.4:8000/test?foo=me&bar=them
foo=me
bar=them
Received a generic put request
这是请求的结果:http://192.168.45.4:8000/test?foo=me%26bar=them
foo=me&bar=them
bar=undefined
Received a generic put request
我一直在为过去敲我的头......(羞愧)......不管多少小时,我不确定我做错了什么。
我很确定这很容易,但我真的无法在论坛上找到它,可能是因为我无法在帖子中专门搜索“%26”。
任何帮助将不胜感激。
解决后编辑
按照 GPack 的建议,我使用了他的解析器代码,它似乎可以工作。只需要确保事先检查 Generic URL 是否有参数。
我仍然相信使用 express 可能有更自然的方法来做到这一点...
这是解析器正在运行的新代码:
broker.all("*", (req,res) => {
const list = req.originalUrl.split("?")[1].split("%26");
const params = list.reduce((obj, str) => {
const parts = str.split("=");
obj[parts[0]] = parts[1];
return obj;
}, {});
console.log(params); // { bar: "them", foo: "me" }
console.log("foo=" + params.foo);
console.log("bar=" + params.bar);
console.log("Received a generic put request");
res.send("I'm just a simple broker");
});
我尝试使用 decodeURI 和 decodeURIComponent 但没有成功。
所以我自己写了解析器:
// The request object should be something like this (with other attributes)
const req = {
originalUrl: "/test?foo=me%26bar=them"
}
// You may want to handle the case where a request doesn't have parameters
const list = req.originalUrl.split("?")[1].split("%26");
const params = list.reduce((obj, str) => {
const parts = str.split("=");
obj[parts[0]] = parts[1];
return obj;
}, {});
console.log(params); // { bar: "them", foo: "me" }
我在解析使用“%26”而不是“&”字符的 HTTP 请求时遇到困难。
上下文:我正在尝试接收由 IP 摄像机发出的 HTTP 请求,该请求具有无法发送“&”字符的限制,因此我必须使用“%26”来设置它来分隔参数,所以相机正在发出这样的 POST 请求:
http://192.168.45.4:8000/test?foo=me%26bar=them
为了在我的服务器端处理这个请求,我有这个简单的函数:
Broker.all("*", (req,res) => {
console.log("foo=" + req.query.foo);
console.log("bar=" + req.query.bar);
console.log("Received a generic put request");
res.send("Processed");
});
当我使用“&”字符发出请求时,这段代码工作正常。
这是请求的结果:http://192.168.45.4:8000/test?foo=me&bar=them
foo=me
bar=them
Received a generic put request
这是请求的结果:http://192.168.45.4:8000/test?foo=me%26bar=them
foo=me&bar=them
bar=undefined
Received a generic put request
我一直在为过去敲我的头......(羞愧)......不管多少小时,我不确定我做错了什么。 我很确定这很容易,但我真的无法在论坛上找到它,可能是因为我无法在帖子中专门搜索“%26”。 任何帮助将不胜感激。
解决后编辑
按照 GPack 的建议,我使用了他的解析器代码,它似乎可以工作。只需要确保事先检查 Generic URL 是否有参数。 我仍然相信使用 express 可能有更自然的方法来做到这一点...
这是解析器正在运行的新代码:
broker.all("*", (req,res) => {
const list = req.originalUrl.split("?")[1].split("%26");
const params = list.reduce((obj, str) => {
const parts = str.split("=");
obj[parts[0]] = parts[1];
return obj;
}, {});
console.log(params); // { bar: "them", foo: "me" }
console.log("foo=" + params.foo);
console.log("bar=" + params.bar);
console.log("Received a generic put request");
res.send("I'm just a simple broker");
});
我尝试使用 decodeURI 和 decodeURIComponent 但没有成功。
所以我自己写了解析器:
// The request object should be something like this (with other attributes)
const req = {
originalUrl: "/test?foo=me%26bar=them"
}
// You may want to handle the case where a request doesn't have parameters
const list = req.originalUrl.split("?")[1].split("%26");
const params = list.reduce((obj, str) => {
const parts = str.split("=");
obj[parts[0]] = parts[1];
return obj;
}, {});
console.log(params); // { bar: "them", foo: "me" }