首页 > 解决方案 > 如何将此 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 个变量不变的同时安全地拆分它

标签: javascriptnode.js

解决方案


如果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)


推荐阅读