【问题标题】:Server incorrectly interpreting JavaScript encoded query params服务器错误地解释 JavaScript 编码的查询参数
【发布时间】:2017-12-26 23:42:56
【问题描述】:

我发现我正在处理的 Phoenix API 没有像我预期的那样处理编码的 url 查询参数 - 地图的格式不正确并且正在评估为 nil...看来 Phoenix 不是将%3D 识别为参数的等号。最好只说明问题:

在客户端,我想向以下网址发出GET 请求:

localhost:4000/api/v1/users?test=testing

我正在检查查询参数并使用以下函数对其进行编码:

const encode = (url) => {
    return (/[?]/.test(url) ? url.slice(0, url.indexOf("?") + 1) + encodeURIComponent(url.split("?")[1]) : url)
}

所以请求发送到

localhost:4000/api/v1/users?test%3Dtesting

但是,当我在服务器上IO.inspect params 时,它会记录

%{"test=testing" => nil}

如果我不对查询参数进行编码,那么服务器会按预期处理这些参数 - %{"test" => "testing"}。

似乎我没有正确编码客户端上的参数。谁能澄清我的错误?

【问题讨论】:

    标签: javascript urlencode query-parameters


    【解决方案1】:

    这种行为是正确的——将= 转义为%3D 意味着= 成为密钥的一部分。这是一个使用流行的 qs 包的简单 Node.js sn-p,它显示了相同的行为:

    > var qs = require('qs');
    > qs.parse('test%3Dtesting');
    { 'test=testing': '' }
    > qs.parse('test=testing');
    { test: 'testing' }
    

    不确定你想用代码做什么,但你可能想使用encodeURI而不是encodeURIComponent,它不会转义=:

    > encodeURIComponent('f o o=bar')
    'f%20o%20o%3Dbar'
    > encodeURI('f o o=bar')
    'f%20o%20o=bar'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-31
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 2020-04-07
      • 2016-07-25
      • 2016-09-01
      相关资源
      最近更新 更多