使用Shell脚本将JSON文件发布到URL

时间:2017-08-15 13:58:39

标签: json bash shell curl

我正在编写一个shell脚本来将JSON文件发布到URL。

标题是:

Content-Type: application/json
Accept: application/json
Account-Number: xxxxxxxx
Authorization: Basic eW91cl91c2VyX25hbWU6cGFzc3dvcmQ=

上面的JSON字符串保存在.JSON文件中,我的curl命令应该处理它并获得所需的响应。我使用以下命令但它没有成功处理:

curl -H "Content-Type: application/json" -X POST -d "data=@$f" https://abcdef.com/test/example/v1/

$ f具有JSON文件名。

我也有以下问题:

  1. 我的标题和JSON字符串应该在同一个JSON文件中吗?如果标题存在于不同的文件中,那么它的扩展名应该是什么?以及如何使用curl命令处理它?<​​/ li>
  2. 我是否应该对{,&#34;,等等特殊字符进行具体处理?

2 个答案:

答案 0 :(得分:5)

您没有发送所有标头。我不相信有一个选项可以从文件中读取所需的标题。

由于您使用bash编写脚本,因此我会将所有选项存储在shell数组中以提高可读性:

curl_opts=(
    -H "Content-Type: application/json"
    -H "Accept: application/json"
    -H "Account-Number: xxxxxxxx"
    -H "Authorization: Basic eW91cl91c2VyX25hbWU6cGFzc3dvcmQ="
    -X POST 
    --data-binary "@$f"
)
curl "${curl_opts[@]}" https://abcdef.com/test/example/v1/

答案 1 :(得分:1)

假设您想要完全按原样发布JSON数据(无需进一步处理),您应该使用--data-binary。如果不需要保留新行等内容,则可以使用-d/--data,但使用-d @file形式,如下所示:

filename=file.json
curl http://httpbin.org/post --data-binary "@$filename" --user "name:password" -H 'Content-Type: application/json' -H 'Accept: application/json' -H 'Account-Number: xxxxxxxx'

当然,修复了JSON中的所有语法错误(如挂逗号,隔离单引号等)。以key=val(或key=@file)形式指定数据,就像您正在尝试一样,不起作用(您可以将其用于-F的表单参数);见valid data part syntax in curl

请注意,使用--data-binary时,默认方法为POST(因此,无需使用-X指定),但您必须指定正确的Content-Type }。

此外,不要手动计算HTTP Basic Auth的Authorization标头,只需使用-u/--user <user:pass>选项。