curl
x-www-form-urlencodeを使用してファイル内でPOST JSONデータを実行しようとしていますdocker-compose
。この例では、このパブリックウェブサイトを使用しており、次のように応答する必要があります。
# sh -c 'curl http://httpbin.org/post -F "json={\"key\": \"value\"}"'
{
"args": {},
"data": "",
"files": {},
"form": {
"json": "{\"key\": \"value\"}"
}, ...
これは外部の一重引用符でうまく機能しますが、内部に変数があるため、二重引用符が必要です。したがって、このコマンドは機能せず、入れ子になった引用符をエスケープする正しい構文を見つけることはできません。
# sh -c "curl http://httpbin.org/post -F "json={\"key\": \"$VAR\"}""
{
"args": {},
"data": "",
"files": {},
"form": {
"json": "{key:"
},
ベストアンサー1
送信されるパラメータに挿入するデータcurl
は、JSON文書をエンコードするJSONエンコード文字列です。
文字列は次のように別々に生成できます。
json_string=$( jq -n --arg 'my key' 'my "value"' '$ARGS.named|@json' )
JSON認識ツールを使用してjq
データをJSONエンコード文字列に変換することで、文字列の内容が有効なJSON文字列であり、指定されたキー、およびを含むmy key
有効なJSON文書にデコードできることを確認します。値、my "value"
。
上記の正確なコマンドは文字列"{\"my key\":\"my \\\"value\\\"\"}"
をに割り当てますjson_string
。
curl
その後、次のようにパラメータからこの文字列を使用して直接呼び出すことができます。
curl 'http://httpbin.org/post' -F "json=$json_string"
sh -c
...または、次のように文字列をそのスクリプトにパラメータとして渡して、インラインスクリプトから呼び出すことができます。
sh -c 'curl "http://httpbin.org/post" -F "json=$1"' sh "$json_string"
これらの呼び出しの1つは、curl
次の応答を取得します。
{
"args": {},
"data": "",
"files": {},
"form": {
"json": "{\"my key\":\"my \\\"value\\\"\"}"
},
"headers": {
"Accept": "*/*",
"Content-Length": "160",
"Content-Type": "multipart/form-data; boundary=------------------------f805cf070f665e7e",
"Host": "httpbin.org",
"User-Agent": "curl/7.84.0",
"X-Amzn-Trace-Id": "Root=1-83012651-2995681c270059da2906c40f"
},
"json": null,
"origin": "xxx.xxx.xxx.xxx",
"url": "http://httpbin.org/post"
}
JSONドキュメントをJSON文字列にエンコードすることはそれcurl
自体で行われるように見えるので、必ずしも必要ではありません。
json_string=$( jq -n -c --arg 'my key' 'my "value"' '$ARGS.named' )
jo
...JSON文字列を生成するか、インストールした場合は短い文字列を生成します。
json_string=$( jo 'my key'='my "value"' )