【问题标题】:How could I curl for a request with headers in shell scripting我如何在 shell 脚本中 curl 请求带有标头的请求
【发布时间】:2016-02-10 10:42:10
【问题描述】:

我尝试执行如下 CURL 语句,我得到了所需的响应:

curl -s -POST --header 'Content-Type: application/json' 'http://www.dummy.com/projectname/page_relevance' -d '{"query": "q_string", "results": [{"abstract": "abs_string", "title": "title_string"}, "mode": "value", "cache": true, "source": "value"}'

但是当我尝试将变量值传递给参数“查询”时,下面提到的 curl 语句不起作用并观察到一些错误语句作为响应:

curl -s -POST --header 'Content-Type: application/json' 'http://www.dummy.com/projectname/page_relevance' -d '{"query": "$query_string", "results": [{"abstract": "abs_string", "title": "title_string"}, "mode": "value", "cache": true, "source": "value"}'

错误声明:

未找到 [CFN #0005]

有效!

这是此服务器的默认网页。

网络服务器软件正在运行,但尚未添加任何内容。

但我确信我第二次用变量构造的 curl 请求类似于我最初执行的 curl 请求。这是使用 echo 测试的,它将 $query_string 替换为正确的值。

我还尝试了另一种方法,其中我没有对单个参数使用任何变量,而是尝试如下:

a='{"query": "query_value", "results": [{"abstract": "abs_string", "title": "title_string"}, "mode": "value", "cache": true, "source": "value"}'
curl -s -POST --header 'Content-Type: application/json' 'http://www.dummy.com/projectname/page_relevance' -d $a

我还尝试使用 ${a}、"$a"、'$a' 替换 a 的值

仍然出现同样的错误。

【问题讨论】:

  • 去掉“-POST”部分作为开​​始,这是完全错误的,然后添加--libcurl dump.txt并检查curl为你的命令发送了什么,它通常会给你很多线索

标签: json bash shell curl cfnetwork


【解决方案1】:

单引号'(您在-d 参数中使用)保留每个字符的字面值,包括$(请参阅this SO answer),这就是为什么您的变量query_string 不是展开。

试试这个:

~$ query_string="my query"

~$ echo '$query_string'
$query_string

~$ echo "$query_string"
my query

因此,如果您希望变量扩展到其值,则需要使用双引号 "。

但是,为了嵌套双引号(在其他双引号内),就像在 JSON 数据中一样,您必须:

  1. 转义内引号,像这样:

    ~$ echo "{\"query\": \"$query_string\"}"
    {"query": "my query"}
    

    但这很快就会变得非常丑陋;或

  2. 在交替的单引号和双引号下

    连接字符串,如下所示:

    ~$ echo '{"query": "'"$query_string"'"}"'
    {"query": "my query"}"
    

    对于较短的字符串可能更具可读性;或

  3. 使用此处文档:

    ~$ read query <<-END
    {"query": "$query_string"}
    END
    
    ~$ echo "$query"
    {"query": "my query"}
    

    Here-documents 对于您希望在其中进行参数/变量扩展、命令替换、算术扩展等的较长文档特别方便。

总之,在使用上述方式之一(可能通过此处文档)定义 JSON 查询后,您可以像这样编写 curl 命令:

curl -s -X POST -H 'Content-Type: application/json' 'http://www.dummy.com/projectname/page_relevance' -d "$query"

【讨论】:

    猜你喜欢
    • 2023-03-15
    • 2013-08-03
    • 1970-01-01
    • 2016-11-10
    • 1970-01-01
    • 1970-01-01
    • 2017-08-09
    • 2022-11-11
    • 1970-01-01
    相关资源
    最近更新 更多