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 $var
para 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 -d
significa), --data-binary
, e --data-urlencoded
.
Você também pode comparar os diferentes comportamentos obtidos com --header
, --data
e--form
(que, por padrão, todos fazem isso POST
de maneiras ligeiramente diferentes)e o que você pode obter com --get
isso, 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 jo
tentarí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 json
variável obteria o valor equivalente a
{
"Some key \"string\"": "My cat's useless"
}
Você pode então usar a json
variável em sua chamada para curl
:
curl -H 'Content-Type: application/json' \
-d "$json" \
'http://localhost:3001/api_v2/some/endpoint'