【问题标题】:Pass code file as part of object JSON using Curl使用 Curl 将代码文件作为对象 JSON 的一部分传递
【发布时间】:2016-11-17 14:59:49
【问题描述】:

我正在尝试编写一个小脚本,将代码的 sn-ps 上传到我们使用的服务提供商,该服务提供商要求您在 JSON 对象中传递该代码。

file_content=$(<my_file.js)
curl -X POST  -H "Content-Type: application/json"
     -d '{"name":$file_name","script":"$file_content"}' https://someservice.com/api/endpoint

file_content 是 my_file 中的 javascript 代码。问题是这样打印的,有效载荷是无效的。我正在尝试找到一种以有效 json 的方式读取该文件的方法。我知道它相当具体,但想知道是否存在这样的命令。

编辑:另一种选择是将整个 JSON 对象放在一个文件中,但如果可能的话,我想避免这种情况。

【问题讨论】:

标签: json bash shell curl


【解决方案1】:

除了在最简单的情况下,您不能像那样构建 JSON,即通过字符串插值。将文件的内容放入 JSON 字符串并不是一件简单的事情。

JSON 需要由实际的 JSON 序列化程序构建。 Python 有这样的序列化器,让 Python 来做就很容易了。

# from http://stackoverflow.com/a/13466143
json_escape () {
    printf '%s' $1 | python -c 'import json,sys; print(json.dumps(sys.stdin.read()))'
}

这样您就可以进行正确的值编码:

file_content=$(<my_file.js)
json_file_name=$(json_escape "fancy filename")
json_file_content=$(json_escape "$file_content")
json='{"name":'$json_file_name',"script":'$json_file_content'}'

curl -X POST -H "Content-Type: application/json" -d "$json" https://someservice.com/api/endpoint

【讨论】:

  • 是的,我认为使用更原始的工具来做的事情有点不合理。非常感谢您的帮助!
  • bash 中没有正确的 JSON 处理,到目前为止我发现的所有内容要么是公然错误,要么使用了外部工具。有一些用于 JSON 操作的工具(例如 stedolan.github.io/jq),但它们可能不在 Linux 的标准发行版中,因此可移植性是一个问题。然而,Python 很可能是可用的,它成熟且速度快。如果您的脚本所做的只是将数据发送到 API,我建议将其完全转换为 Python 脚本。您可以使用 Python 发出 HTTP 请求并可能处理响应。
  • 同意。最后我选择了一个 Ruby 脚本,这更容易和简单,我只是在玩这个想法,但最后使用适当的工具更简单。
【解决方案2】:

使用jq的JSON序列化能力:

cat my_file.js | jq '@json'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-23
    • 2021-01-21
    • 2011-04-26
    • 1970-01-01
    • 2019-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多