将复杂对象转换为x-www-form-urlencoded



我有一个像这样的对象:

{
"someList": [
{
"accountNumber": 123456,
"balance": 3.14
},
{
"accountNumber": 7890,
"balance": 2.72
}
],
"numErrors": 0,
"duration": 12345
}

我如何将其转换为x-www-form-urlencoded以便在POST请求中使用curl命令行发送它?我知道"key1=value1&key2=value2",但我对如何发送包含结构的整个列表特别困惑。

我想这完全取决于你要发布到的服务器。
如果它接受urlencoded形式的美化JSON,那么--data-urlencode @input.jsoncurl就足够了。如果没有,您必须先将其最小化/序列化,那么像xidel这样的json解析器可以提供帮助:

$ xidel -s input.json -e 'serialize($json,{"method":"json"})'
{"someList":[{"accountNumber":123456,"balance":3.14},{"accountNumber":7890,"balance":2.72}],"numErrors":0,"duration":12345}
$ xidel -s input.json -e 'serialize($json,{"method":"json"})' | 
curl -s --data-urlencode @- "<url>"
$ xidel -s input.json -e 'uri-encode(serialize($json,{"method":"json"}))'
%7B%22someList%22%3A%5B%7B%22accountNumber%22%3A123456%2C%22balance%22%3A3.14%7D%2C%7B%22accountNumber%22%3A7890%2C%22balance%22%3A2.72%7D%5D%2C%22numErrors%22%3A0%2C%22duration%22%3A12345%7D
$ xidel -s input.json -e 'uri-encode(serialize($json,{"method":"json"}))' | 
curl -s -d @- "<url>"

xidel也可以做POST请求:

$ xidel -s 
-d '{uri-encode(serialize(json-doc("input.json"),{"method":"json"}))}' 
"<url>" 
-e '$raw'
$ xidel -s input.json -e '
x:request({
"post":uri-encode(serialize($json,{"method":"json"})),
"url":"<url>"
})/raw
'
  • -e '$raw'显示原始输出,类似于curl
  • xidel -s input.json -d '...$json...'不起作用,因为-d在读取输入之前被求值,因此json-doc()在查询中打开文件/url。

最新更新