服务器错误地解释 JavaScript 编码的查询参数
Server incorrectly interpreting JavaScript encoded query params
我发现我正在使用的 Phoenix API 没有像我期望的那样处理编码的 url 查询参数 - 地图的格式不正确并且正在评估 nil
... Phoenix 似乎没有将 %3D
识别为参数的等号。最好我只是说明问题:
在客户端,我想向以下 url 发出 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"}
.
看来我没有正确编码客户端的参数。谁能澄清我的错误?
此行为是正确的——将 =
转义为 %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'
我发现我正在使用的 Phoenix API 没有像我期望的那样处理编码的 url 查询参数 - 地图的格式不正确并且正在评估 nil
... Phoenix 似乎没有将 %3D
识别为参数的等号。最好我只是说明问题:
在客户端,我想向以下 url 发出 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"}
.
看来我没有正确编码客户端的参数。谁能澄清我的错误?
此行为是正确的——将 =
转义为 %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'