服务器错误地解释JavaScript编码的查询参数

时间:2017-12-24 16:58:15

标签: javascript urlencode query-parameters

我发现我正在处理的Phoenix API并没有像我期望的那样处理编码的url查询参数 - 地图没有正确形成并正在评估nil ...好像凤凰城没有认为%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"}

似乎我没有在客户端上正确编码params。任何人都可以澄清我的错误吗?

1 个答案:

答案 0 :(得分:1)

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

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

不确定您尝试对代码执行了哪些操作,但您可能希望使用encodeURI而不是encodeURIComponent来逃避=:< / p>

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