使用 application/json 时转义在curl数据中发送的字符串

使用 application/json 时转义在curl数据中发送的字符串

我正在使用 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 ''".我如何在使用curl时转义它?

我想我需要做以下事情:

  • 如果字符串包含"转义符,则使用三个反斜杠\\\"

  • 如果字符串包含'转义符,则不需要转义'

  • 如果字符串包含\转义符,则使用三个反斜杠\\\\

有没有我忘记的角色?

答案1

我假设您的目标只是让字符串通过 shell 的解析。如果是这样,请使用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如果键的值以 结尾,则会尝试推断该值是一个数组条目[]

对于上述代码的两种变体,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'

相关内容