查询字符串与JSON互转
查询字符串与 JSON 互转
在发送 HTTP 请求的时候,要模拟一个登录请求的包,而抓到得包如下
POST https://xxx.xxx.com/xxx/login HTTP/1.1
Host: xxx.xxx.com
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3775.400 QQBrowser/10.6.4208.400
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Content-Type: application/x-www-form-urlencoded
username=kuizuo&password=a12345678
但是我要模拟这样的请求就要写成如下方式
let url = 'https://xxx.xxx.com/xxx/login'
let username = 'kuizuo'
let password = 'a12345678'
let data = 'username=' + username + '&password=' + password
// or
// let data = `username=${username}&password=${password}`
axios.post(url, data).then(function (res) {
console.log(res.data)
})
像这种 username=kuizuo&password=a12345678
就称之为查询字符串。显而易见,如果涉及到的参数一多修改显得十分不可靠(极易改错)。
所以一般的做法都是将 data 用 js 对象或者用 json 格式表示,像下面这样
let username = 'kuizuo'
let password = 'a12345678'
let data = {
username: username,
password: password,
}
不过请求头是Content-Type: application/x-www-form-urlencoded
,那么就需要使用工具将其转化为查询字符串了。比方说 node 中自带的 querystring 库。
querystring
const qs = require('querystring')
let obj = {
username: 'kuizuo',
password: 'a12345678',
}
let data = qs.stringify(obj)
// username=kuizuo&password=a12345678
const qs = require('querystring')
let data = 'username=kuizuo&password=a12345678'
let json = qs.parse(data)
// { username: 'kuizuo', password: 'a12345678' }
使用正则与 array.reduce
除了借用 querystring 库之外,实际还可以通过正则匹配与array.reduce()
,将查询字符串 js 对象。这里就放一下对应的代码:
function qs2Json(str) {
return (str.match(/([^=&]+)(=([^&]*))/g) || []).reduce((a, val) => ((a[val.slice(0, val.indexOf('='))] = val.slice(val.indexOf('=') + 1)), a), {})
}
js 对象转查询字符串就相对简单许多了,只需要对 js 对象遍历,然后使用使用&拼接即可。具体转化代码
function json2Qs(obj) {
return Object.keys(obj)
.map((key) => {
return key + '=' + obj[key]
})
.join('&')
}
不过这里遍历的时候还可以添加一些判断的,比如if (obj[key] === undefined) return ''
,如果键值未定义就返回空字符串,或者清除数组一些为空字符串或 null 等值,这里我就不做过多判断了。
至于要转成 json 格式字符串还是解析 通过JSON.stringify
与 JSON.parse
即可,这里就不在演示了。
最终两者的执行效果
let obj = qs2Json('username=kuizuo&password=a12345678')
// {username: "kuizuo", password: "a12345678"}
let param = json2Qs({ username: 'kuizuo', password: 'a12345678' })
// username=kuizuo&password=a12345678