Escape strings enviadas em dados curl ao usar o aplicativo / json

3

Estou usando o 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 colocar a 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 com uma barra invertida tripla \\" .

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

  • Se a string contiver um \ , escape com uma tríplice barra invertida \\ .

Há algum personagem que estou esquecendo?

    
por Donny P 15.10.2014 / 23:08

2 respostas

3

Eu vou assumir que seu objetivo é apenas pegar a string após a análise do shell. Em caso afirmativo, 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 + d para 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 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"
    
por 16.10.2014 / 03:15
1

Você provavelmente não precisaria de 3 dessas barras invertidas se puder 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

Veja man curl . Sugiro que preste 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 que obteve com --header , --data e --form (que, por padrão, todos fazem POST de maneiras ligeiramente diferentes) , e o que você pode obter com --get , que pode, em vez disso, codificar os dados especificados com qualquer um dos URLs mencionados anteriormente no URL de solicitação após um ? .

    
por 16.10.2014 / 04:35

Tags