我发现我正在研究的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。任何人都可以澄清我的错误吗?
这种行为是正确的 - 逃离=
,因为%3D
意味着=
成为关键的一部分。这是一个简单的Node.js片段,使用流行的qs
包,它显示了相同的行为:
> 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'