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

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

CURLを使用してJSONデータを送信しています。例は次のとおりです。

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 ''".カールを使用するときに文字列をどのようにエスケープしますか?

私は次のことを行うべきだと思います。

  • 文字列に"エスケープ文字が含まれている場合は、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前述の特定のデータを?

答え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キー値がで終わる場合は、その値が配列項目であると推定しようとします[]

上記のコードの2つのバリエーションでは、変数は次のようになります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'

関連情報