0

我有一个这样的对象:

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

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

4

1 回答 1

1

我想这一切都取决于您要发布到的服务器。
如果它以 urlencoded 形式接受您的美化 JSON,--data-urlencode @input.json那么curl. 如果没有,并且您必须先对其进行缩小/序列化,那么像这样的 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。
于 2021-10-16T20:54:29.743 回答