application/json を使用するときに curl データで送信される文字列をエスケープする

application/json を使用するときに curl データで送信される文字列をエスケープする

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わずかに異なる方法で実行されます)、および--getwhich を使用すると、代わりに、前述の のいずれかで指定されたデータを に続くリクエスト 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'

関連情報