我正在尝试使用curl将一些数据的标头和键值对发送到我的服务器。看来我遇到了bash引用问题,我的键值对像主机一样被对待。
curl -v --header "Content-Type: application/json" \
--header "Foo: Bar 123456" \
-d \"\{ "baz": "glern", "froboz": "foo again"\}\" \
https://example.com > foo.html 2> error.txt
example.com告诉我:
HTTP 404 Not Found: URL or Document not found (dns_unresolved_hostname)
HTTP 404: Your requested host "baz" could not be resolved by DNS. The document at the specified URL does not exist.
HTTP 404 Not Found: URL or Document not found (dns_unresolved_hostname)
HTTP 404: Your requested host "glern," could not be resolved by DNS. The document at the specified URL does not exist.
and error.txt像这样开始:
* Rebuilt URL to: baz:/
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* Trying 10.196.133.236...
* TCP_NODELAY set
* Connected to http.proxy.mycompanyproxy.com (10.196.133.236) port 8000 (#0)
> POST http://baz:/ HTTP/1.1
> Host: baz
> User-Agent: curl/7.54.0
> Accept: */*
> Proxy-Connection: Keep-Alive
> Content-Type: application/json
> Foo: Bar 123456
> Content-Length: 2
> } [2 bytes data]
* upload completely sent off: 2 out of 2 bytes
< HTTP/1.1 404 Not Found
...
我当然不是故意要打主机,笨拙的东西等等……这肯定像是外壳引用问题。但是在尝试了许多不同的操作之后,例如在我的键值对周围的现有空白处添加了额外的“ \”,我在这里有点迷失了。
答案 0 :(得分:3)
在<video src='https://anotherServer.com/assets/myVideo.mp4' controls> </video>
之后,只有-d
构成\"\{
的参数。尚不清楚您在追求什么,但也许:
-d
这样,curl -v --header "Content-Type: application/json" \
--header "Foo: Bar 123456" \
-d '{ "baz": "glern", "froboz": "foo again"}' \
https://example.com > foo.html 2> error.txt
的参数为:
-d
没有调用在包含大量双引号的字符串周围使用双引号;只会让生活更艰难。
答案 1 :(得分:3)
考虑一下,如果您只拥有一个文件,数据将是什么样:
$ cat tmp.json
{ "baz": "glern", "froboz": "foo again" }
在这种情况下,您只需使用
$ curl ... -d "$(cat tmp.json)"
现在可以这么说(只需将双引号切换为单引号,以避免在命令行上转义一串引号):
$ curl ... -d '{ "baz": "glern", "froboz": "foo again" }'
# with double quotes, it's
# curl ... -d "{ \"baz\": \"glern\", \"froboz\": \"foo again\" }"
# ... ew.
尽管如此,通常最好让jq
之类的工具为您生成JSON,而不是尝试手动编写JSON。这样可以在需要时大大简化报价。
$ curl ... -d "$(jq -n '{baz: "glern", froboz: "foo again"}')"
如果您的JSON不是经过硬编码的,而是来自{"baz": "$SOME_VAR"}
之类的变量,则几乎必须使用这种工具。不用跳圈来确保SOME_VAR
中的所有内容均已正确转义,而是让jq
为您完成:jq -n --argjson x "$SOME_VAR" '{baz: $x}'
。注意$x
是不是一个shell变量;这是一个jq
变量。