【问题标题】:GET or POST from express do not parse a "percent sign" request来自 express 的 GET 或 POST 不解析“百分号”请求
【发布时间】:2021-08-20 16:55:27
【问题描述】:

我在解析使用“%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 的建议,我使用了他的解析器代码,它似乎可以正常工作。只需要确保事先检查通用 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");
});

【问题讨论】:

    标签: node.js express parsing escaping node-modules


    【解决方案1】:

    我尝试使用 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" }
    

    【讨论】:

    • 谢谢!这确实解决了这个问题,但我试图避免这种情况,我假设 express 或其他东西会被设计来处理这个......
    • 那么...你会考虑接受我的回答吗?
    • 我一直在尝试将您的解析器功能应用于我的,并发现了困难。遇到困难我会编辑我的帖子。
    • 你在做var list = req.query.foo;,应该是var list = req.query;
    • 如果我使用list = req.query;,我会收到“list.reduce 不是函数”错误。如果我使用list = req.query.split("&");,我会收到“拆分不是函数”错误。如果我使用 var list = req.query.split("%26"); 它可以工作,但我会得到这个结果: { '{"foo":"me&bar': 'them"}' }
    猜你喜欢
    • 1970-01-01
    • 2015-09-22
    • 2016-10-17
    • 1970-01-01
    • 1970-01-01
    • 2015-03-08
    • 2022-11-07
    • 2020-10-22
    • 1970-01-01
    相关资源
    最近更新 更多