我尝试按如下方式执行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"}'
但是当我试图将变量值传递给参数“query”时,下面提到的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'
仍然观察到相同的错误。
答案 0 :(得分:2)
单引号'
(您在-d
参数中使用)保留每个字符的字面值,包括$
(请参阅this SO answer),这就是为什么您的变量query_string
未展开。
试试这个:
~$ query_string="my query"
~$ echo '$query_string'
$query_string
~$ echo "$query_string"
my query
因此,如果您希望变量扩展到其值,则需要使用双引号"
。
但是,为了嵌套双引号(在其他双引号内),就像在JSON数据中一样,您必须:
转义内部引号,如下所示:
~$ echo "{\"query\": \"$query_string\"}"
{"query": "my query"}
但很快就会变得非常丑陋;或
连接字符串,如下所示:
~$ echo '{"query": "'"$query_string"'"}"'
{"query": "my query"}"
对于较短的字符串可能更具可读性;或
使用 here-document :
~$ read query <<-END
{"query": "$query_string"}
END
~$ echo "$query"
{"query": "my query"}
Here-documents对于您希望进行参数/变量扩展,命令替换,算术扩展等的较长文档特别方便。
总之,在使用上述方法之一(可能通过here-document)定义JSON查询之后,您可以像这样编写curl
命令:
curl -s -X POST -H 'Content-Type: application/json' 'http://www.dummy.com/projectname/page_relevance' -d "$query"