Strings de escape enviadas em dados curl ao usar application/json

Strings de escape enviadas em dados curl ao usar application/json

Estou usando CURL para enviar dados JSON. Aqui está um exemplo:

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"

Como posso escapar do conteúdo de qualquer valor para some_string?

Por exemplo, se alguém quiser inserir uma string, Abe Lincoln's favorite character is the backslash \. He said "I love the \ and single quotes like ''".como posso escapar disso enquanto uso o curl?

Acho que preciso fazer o seguinte:

  • Se a string contiver um "escape, ela será com uma barra invertida tripla \\\".

  • Se a string contiver um 'escape, não será necessário escapar '.

  • Se a string contiver um \escape, ela será com uma barra invertida tripla \\\\.

Tem algum personagem que estou esquecendo?

Responder1

Vou assumir que seu objetivo é apenas fazer com que a string passe pela análise do shell. Se sim, use read:

Por exemplo

$ IFS='' read -r var

Em seguida, cole manualmente a linha.

Se forem várias linhas, você pode usar:

$ IFS='' read -r -d '' var

E cole novamente, mas desta vez use CTRL+ dpara finalizar a entrada.

Ou use um heredoc:

$ IFS='' read -r -d '' var <<'EOF'
{ "some_string": "Hello mom it's me!" }
EOF

 

Qualquer que seja o método usado, você pode simplesmente usar a variável $varpara acessá-lo:

$ curl -H "Content-Type: application/json" \
 -d  "$var" \
 "http://localhost:3001/api_v2/blocks/42af6ab04d9d9635a97f8abec14ed023?api_key=fe5cf0d86af27c086ab5cd4d0eab6641"

Responder2

Você provavelmente não precisaria de três dessas barras invertidas se pudesse remover o shell da equação. Felizmente, você pode:

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

Olhe para man curl. Sugiro prestar muita atenção às diferenças entre--data-ascii (que é o que -dsignifica), --data-binary, e --data-urlencoded.

Você também pode comparar os diferentes comportamentos obtidos com --header, --datae--form (que, por padrão, todos fazem isso POSTde maneiras ligeiramente diferentes)e o que você pode obter com --getisso, em vez disso, pode codificar os dados especificados com qualquer um dos itens mencionados anteriormente no URL da solicitação após um ?.

Responder3

Considere usar uma ferramenta compatível com JSON para criar o documento JSON.

Usando jq:

json=$(
    jq -n --arg 'Some key "string"' "My cat's useless" '$ARGS.named'
)

Usando jo:

json=$( jo 'Some key "string"'="My cat's useless" )

Observe que jotentaríamos inferir que o valor é uma entrada de matriz se o valor da chave terminar em [].

Com ambas as variações do código acima, a jsonvariável obteria o valor equivalente a

{
  "Some key \"string\"": "My cat's useless"
}

Você pode então usar a jsonvariável em sua chamada para curl:

curl -H 'Content-Type: application/json' \
    -d "$json" \
    'http://localhost:3001/api_v2/some/endpoint'

informação relacionada