javascript - 如何将此 QueryString 转换为 JS 对象?[节点]
问题描述
我有以下查询字符串,它是有线卡的 IPN,所以我不能修改这个输入,这是我在 POST 中收到的。
我不知道为什么这是作为 text/plain 而不是 application/json 发送的
https://doc.wirecard.com/GeneralPlatformFeatures.html#GeneralPlatformFeatures_IPN
response-signature-base64=sGwuDEpTnTB7XwzPga8DG+pYYjB3bga7YOZI8n26yOns=&response-signature-algorithm=HmacSHA256&response-base64=eyJwYXltZW50Ijp7InN0YXR1c2VzIjp7InN0YXR1cyI6W3siY29kZSI6Ij
IwMS4wMDAwIiwiZGVzY3JpcHRpb24iOiIzZC1hY3F1aXJlcjpUaGUgcmVzb3VyY2Ugd2FzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkLiIsInNldmVyaXR5IjoiaW5mb3JtYXRpb24ifV19LCJjYXJkIjp7ImV4cGlyYXRpb24tbW9udGgiOjEsImV4cGl
yYXRpb24teWVhciI6MjAyMywiY2FyZC10eXBlIjoidmlzYSJ9LCJkZXNjcmlwdG9yIjoiIiwibm90aWZpY2F0aW9ucyI6eyJub3RpZmljYXRpb24iOlt7InVybCI6Imh0dHBzOi8vNDY0Yjk4N2M2ZDk5Lm5ncm9rLmlvL3B1YmxpY3Mvd2lyZWNh
cmQyIn1dLCJmb3JtYXQiOiJhcHBsaWNhdGlvbi9qc29uLXNpZ25lZCJ9LCJtZXJjaGFudC1hY2NvdW50LWlkIjp7InZhbHVlIjoiN2E2ZGQ3NGYtMDZhYi00ZjNmLWE4NjQtYWRjNTI2ODcyNzBhIn0sInRyYW5zYWN0aW9uLWlkIjoiOTQwNGIxN
jQtMTgzYy00ZjllLThmNGEtN2QzMGUxODA2ZWRjIiwicmVxdWVzdC1pZCI6Ijk3NzJiMzViLTdmYmUtNGYxZS04NmQ5LThhNjMwZDljZDg3YyIsInRyYW5zYWN0aW9uLXR5cGUiOiJwdXJjaGFzZSIsInRyYW5zYWN0aW9uLXN0YXRlIjoic3VjY2
VzcyIsImNvbXBsZXRpb24tdGltZS1zdGFtcCI6MTU5NTkyNDA0OTAwMCwicmVxdWVzdGVkLWFtb3VudCI6eyJ2YWx1ZSI6MTAsImN1cnJlbmN5IjoiVVNEIn0sImFjY291bnQtaG9sZGVyIjp7ImZpcnN0LW5hbWUiOiJkIiwibGFzdC1uYW1lIjo
iZCJ9LCJjYXJkLXRva2VuIjp7InRva2VuLWlkIjoiNDI0Mjc5NjQ0NDA5MDAxOCIsIm1hc2tlZC1hY2NvdW50LW51bWJlciI6IjQyMDAwMCoqKioqKjAwMTgifSwicGF5bWVudC1tZXRob2RzIjp7InBheW1lbnQtbWV0aG9kIjpbeyJuYW1lIjoi
Y3JlZGl0Y2FyZCJ9XX0sImF1dGhvcml6YXRpb24tY29kZSI6IjE0Mzk3NyIsImFwaS1pZCI6IndwcCIsImNhbmNlbC1yZWRpcmVjdC11cmwiOiJodHRwczovL2RlbW9zaG9wLXRlc3Qud2lyZWNhcmQuY29tL2RlbW9zaG9wLyMvY2FuY2VsIiwiZ
mFpbC1yZWRpcmVjdC11cmwiOiJodHRwczovL2RlbW9zaG9wLXRlc3Qud2lyZWNhcmQuY29tL2RlbW9zaG9wLyMvZXJyb3IiLCJzdWNjZXNzLXJlZGlyZWN0LXVybCI6Imh0dHBzOi8vZGVtb3Nob3AtdGVzdC53aXJlY2FyZC5jb20vZGVtb3Nob3
AvIy9zdWNjZXNzIiwicHJvdmlkZXItYWNjb3VudC1pZCI6IjcwMDEwIn19
如您所见,查询参数是 base64 编码的,这是一个问题,因为它包含 + 和 =,如果使用 URLSearchParams 或任何其他转换方法,它们将会中断。
我尝试使用 bodyparser.urlencoded 但这会将“+”转换为“”
我怎样才能在保持 3 个变量不变的同时安全地拆分它
- 响应签名base64
- 响应签名算法
- 响应-base64
解决方案
如果URL Web APIsearchParams
可用,您可以创建一个 URL 并从中 读取。
如果没有,您可以使用 Javascriptssplit()
函数使用 limit 参数:
queryString.split('&').map((value) => value.split('=', 2));
如果数组数组不是您想要的,您可以附加其他处理步骤并执行以下操作:
queryString
.split('&').map((value) => value.split('=', 2))
.reduce((obj, value) => {
obj[value[0]] = value[1];
return obj;
}, {});
下面的代码片段显示了正在运行的代码
const queryString = 'response-signature-base64=sGwuDEpTnTB7XwzPga8DG+pYYjB3bga7YOZI8n26yOns=&response-signature-algorithm=HmacSHA256&response-base64=eyJwYXltZW50Ijp7InN0YXR1c2VzIjp7InN0YXR1cyI6W3siY29kZSI6IjIwMS4wMDAwIiwiZGVzY3JpcHRpb24iOiIzZC1hY3F1aXJlcjpUaGUgcmVzb3VyY2Ugd2FzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkLiIsInNldmVyaXR5IjoiaW5mb3JtYXRpb24ifV19LCJjYXJkIjp7ImV4cGlyYXRpb24tbW9udGgiOjEsImV4cGlyYXRpb24teWVhciI6MjAyMywiY2FyZC10eXBlIjoidmlzYSJ9LCJkZXNjcmlwdG9yIjoiIiwibm90aWZpY2F0aW9ucyI6eyJub3RpZmljYXRpb24iOlt7InVybCI6Imh0dHBzOi8vNDY0Yjk4N2M2ZDk5Lm5ncm9rLmlvL3B1YmxpY3Mvd2lyZWNhcmQyIn1dLCJmb3JtYXQiOiJhcHBsaWNhdGlvbi9qc29uLXNpZ25lZCJ9LCJtZXJjaGFudC1hY2NvdW50LWlkIjp7InZhbHVlIjoiN2E2ZGQ3NGYtMDZhYi00ZjNmLWE4NjQtYWRjNTI2ODcyNzBhIn0sInRyYW5zYWN0aW9uLWlkIjoiOTQwNGIxNjQtMTgzYy00ZjllLThmNGEtN2QzMGUxODA2ZWRjIiwicmVxdWVzdC1pZCI6Ijk3NzJiMzViLTdmYmUtNGYxZS04NmQ5LThhNjMwZDljZDg3YyIsInRyYW5zYWN0aW9uLXR5cGUiOiJwdXJjaGFzZSIsInRyYW5zYWN0aW9uLXN0YXRlIjoic3VjY2VzcyIsImNvbXBsZXRpb24tdGltZS1zdGFtcCI6MTU5NTkyNDA0OTAwMCwicmVxdWVzdGVkLWFtb3VudCI6eyJ2YWx1ZSI6MTAsImN1cnJlbmN5IjoiVVNEIn0sImFjY291bnQtaG9sZGVyIjp7ImZpcnN0LW5hbWUiOiJkIiwibGFzdC1uYW1lIjoiZCJ9LCJjYXJkLXRva2VuIjp7InRva2VuLWlkIjoiNDI0Mjc5NjQ0NDA5MDAxOCIsIm1hc2tlZC1hY2NvdW50LW51bWJlciI6IjQyMDAwMCoqKioqKjAwMTgifSwicGF5bWVudC1tZXRob2RzIjp7InBheW1lbnQtbWV0aG9kIjpbeyJuYW1lIjoiY3JlZGl0Y2FyZCJ9XX0sImF1dGhvcml6YXRpb24tY29kZSI6IjE0Mzk3NyIsImFwaS1pZCI6IndwcCIsImNhbmNlbC1yZWRpcmVjdC11cmwiOiJodHRwczovL2RlbW9zaG9wLXRlc3Qud2lyZWNhcmQuY29tL2RlbW9zaG9wLyMvY2FuY2VsIiwiZmFpbC1yZWRpcmVjdC11cmwiOiJodHRwczovL2RlbW9zaG9wLXRlc3Qud2lyZWNhcmQuY29tL2RlbW9zaG9wLyMvZXJyb3IiLCJzdWNjZXNzLXJlZGlyZWN0LXVybCI6Imh0dHBzOi8vZGVtb3Nob3AtdGVzdC53aXJlY2FyZC5jb20vZGVtb3Nob3AvIy9zdWNjZXNzIiwicHJvdmlkZXItYWNjb3VudC1pZCI6IjcwMDEwIn19'
const result = queryString
.split('&').map((value) => value.split('=', 2))
.reduce((obj, value) => {
obj[value[0]] = value[1];
return obj;
}, {});
console.log(result)
推荐阅读
- google-sheets - Google表格中查询命令ORDER BY的问题
- pandas - 熊猫:爆炸数组元素和组?
- octobercms - Octobercms 在 media.file.upload 事件中上传后重命名文件
- excel - VBA VLookup 不返回任何结果,但我可以直接调用这些值
- java - Android 工作室 - Rider.getName()' 上的空对象引用
- mongodb - MongoDB:带参数的createCollection
- system-verilog - 在 Quartus Prime 的 SystemVerilog 中使用 $ceil 定义参数
- perl - perl 脚本是为哪个版本的 perl 编写的?
- c# - 使用计时器自动折叠树节点
- r - R中使用不同计算机的相对路径