O envio de uma solicitação POST via curl tem problemas com aspas duplas

0

Então, para enviar uma solicitação POST para o gists (github), você pode fazer algo parecido com o visto no link

curl --user "user" -X POST --data '{"description":"Created via API","public":"true","files":{"file1.txt":{"content":"Demo"}}' https://api.github.com/gists

Mas, no exemplo acima, o nome do arquivo e o conteúdo do arquivo são codificados, que é a parte .. file1.txt":{"content":"Demo"} ..

Estou substituindo a parte acima pela minha variável $file":{"content":"$content"} , mas inicializando a variável, a solicitação do json deve estar entre aspas duplas, o que fiz como

curl --user "user" -X POST --data "{\"description\":\"Created via API\",\"public\":\"true\",\"files\":{\"$file\":{\"content\":\"$content\"}}' https://api.github.com/gists

Mas isso não funciona, eu recebo o erro json.

{
  "message": "Problems parsing JSON",
  "documentation_url": "https://developer.github.com/v3/gists/#create-a-gist"
}

Mesmo se eu substituí todas as aspas duplas com \' aspas simples.

Alguém sabe como incluir uma variável dentro desta solicitação do json? btw: Eu usei todos os cabeçalhos, como

 -H "Content-Type: application/json; charset=UTF-8" 

e muitas combinações para validar o pedido, mas sem sucesso

UPDATE.

É assim que todo o conteúdo se parece.

function gist_controller(){
    content=$(cat $1)
    DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
    read -p "enter your password - " pass 
    public="false"
    gist_content=$(cat $1)
    curl --user "samserayo"  -H "Content-Type: application/json; charset=UTF-8" -X POST -d  "{ 'description': 'Created via API', 'public': 'true', 'files':{ ' '$1 ':{ 'content': '$gist_content'}}" https://api.github.com/gists
}
    
por samayo 18.04.2016 / 22:12

3 respostas

0

Você não mostra o valor que definiu para $ file ou $ content. O que esses dois expandem para? É provável que um, ou o outro, ou ambos, contenham caracteres que o analisador JSON não goste. Provavelmente, algo dentro do valor de expansão variável precisa ser ainda mais escapado ou codificado antes do envio ao analisador JSON por meio de curl.

Você EXPORTAR as variáveis de ambiente?

Tente:

echo "$file $content";

para se certificar de que ambos estão definidos como você espera que eles sejam.

    
por 18.04.2016 / 23:09
0

Você não especificou qual shell está usando, mas qualquer coisa entre aspas duplas está sujeita à expansão de nome de arquivo do shell. Em particular, {} tem significado para a maioria das shells. Essa é a razão pela qual o exemplo que você citou usou aspas simples para envolver a coisa toda.

Escapes do shell são complicados e, às vezes, parece impossível conseguir o que você deseja. Honestamente, em casos como este, eu escreveria um script Python para chamar curl, onde eu sei que o shell não está "me ajudando".

    
por 19.04.2016 / 04:33
-1

Você tem que colocar a string inteira entre aspas duplas " . E você precisa escapar as citações dentro da string (não convertê-las em outros tipos de citações!).

Então, em vez de:

"{ 'description': 'Created via API', 'public': 'true', 'files':{ ' '$1 ':{ 'content': '$gist_content'}}"

Você quer:

"{ \"description\": \"Created via API\", \"public\": \"true\", \"files\" : { \"$1\" : { \"content\": \"$gist_content\"}}}"

Provavelmente você deve testar com echo e garantir que a string esteja exatamente correta.

    
por 19.04.2016 / 10:28

Tags