JSON データを送信するために CURL を使用しています。次に例を示します。
mycomputer$ curl -H "Content-Type: application/json"
-d "{ "some_string": "Hello mom it's me!" }"
"http://localhost:3001/api_v2/blocks/42af6ab04d9d9635a97f8abec14ed023?api_key=fe5cf0d86af27c086ab5cd4d0eab6641"
の任意の値の内容をエスケープするにはどうすればよいですかsome_string
?
たとえば、誰かが文字列を入力したい場合、Abe Lincoln's favorite character is the backslash \. He said "I love the \ and single quotes like ''".
curl を使用しながらこれをエスケープするにはどうすればよいでしょうか?
以下のことを行う必要があると思います:
文字列に
"
エスケープ文字が含まれている場合は、3 つのバックスラッシュでエスケープします\\\"
。文字列に
'
エスケープが含まれている場合は、エスケープする必要はありません'
。- 文字列に
\
エスケープ文字が含まれている場合は、3 つのバックスラッシュでエスケープします\\\\
。
忘れている文字はありますか?
答え1
あなたの目的は、シェルの解析を通過した文字列を取得することだけだと仮定します。そうであれば、以下を使用しますread
。
例えば
$ IFS='' read -r var
次に、手動で行を貼り付けます。
複数行の場合は以下を使用できます:
$ IFS='' read -r -d '' var
もう一度貼り付けますが、今回はCTRL+を使用してd入力を終了します。
または、ヒアドキュメントを使用します:
$ IFS='' read -r -d '' var <<'EOF'
{ "some_string": "Hello mom it's me!" }
EOF
どちらの方法を使用する場合でも、変数を使用して$var
アクセスできます。
$ curl -H "Content-Type: application/json" \
-d "$var" \
"http://localhost:3001/api_v2/blocks/42af6ab04d9d9635a97f8abec14ed023?api_key=fe5cf0d86af27c086ab5cd4d0eab6641"
答え2
シェルを方程式から削除できれば、おそらく 3 つのバックスラッシュは必要なくなります。幸いなことに、次のことが可能です。
curl --config - <<\DATA
url = "http://some.url"
header = "Content-Type: application/json"
data = "{ \"some_string\": "Abe Lincoln's favorite character is the backslash \\. He said \"I love the \\ and single quotes like '.\""
#END
DATA
を見てくださいman curl
。違いに細心の注意を払うことをお勧めします。--data-ascii
(それが意味するのは-d
)、--data-binary
、 そして--data-urlencoded
。
--header
、、--data
およびで得られるさまざまな動作を比較することもできます。--form
(デフォルトでは、すべてがPOST
わずかに異なる方法で実行されます)、および--get
which を使用すると、代わりに、前述の のいずれかで指定されたデータを に続くリクエスト URL にエンコードできます?
。
答え3
JSON ドキュメントを作成するには、JSON 対応ツールの使用を検討してください。
使用方法jq
:
json=$(
jq -n --arg 'Some key "string"' "My cat's useless" '$ARGS.named'
)
使用方法jo
:
json=$( jo 'Some key "string"'="My cat's useless" )
jo
キーの値が で終わる場合、 は値が配列エントリであると推測しようとすることに注意してください[]
。
上記のコードのどちらのバリエーションでも、json
変数は次の値を取得します。
{
"Some key \"string\"": "My cat's useless"
}
json
次に、次の呼び出しで変数を使用できますcurl
。
curl -H 'Content-Type: application/json' \
-d "$json" \
'http://localhost:3001/api_v2/some/endpoint'