Como colocar um objeto json com uma matriz usando curl

95

Tenho uma série de dados para inserir no banco de dados. A interface do usuário para inserir os dados não é boa para a entrada em massa, então estou tentando formular um equivalente de linha de comando. Quando examino a solicitação de rede da IU no cromo, vejo uma solicitação PUT de um objeto json. Quando tento replicar o pedido

curl -H 'Accept: application/json' -X PUT '{"tags":["tag1","tag2"],"question":"Which band?","answers":[{"id":"a0","answer":"Answer1"},{"id":"a1","answer":"answer2"}]}' http://example.com/service`

Eu recebo um erro

curl: (3) [globbing] colchetes aninhados não são suportados na pos X

Onde X é a posição do caractere do primeiro "[".

Como posso colocar um objeto json que inclui uma matriz?

Miles Libbey
fonte

Respostas:

148

Sua linha de comando deve ter um -d / - dados inseridos antes da string que você deseja enviar no PUT, e você deseja definir o Tipo de Conteúdo e não Aceitar.

curl -H 'Content-Type: application/json' -X PUT -d '[JSON]' http://example.com/service

Usando os dados JSON exatos da pergunta, a linha de comando completa se tornaria:

curl -H 'Content-Type: application/json' -X PUT \
-d '{"tags":["tag1","tag2"],"question":"Which band?","answers":[{"id":"a0","answer":"Answer1"},{"id":"a1","answer":"answer2"}]}' \
http://example.com/service
Daniel Stenberg
fonte
4
-1 porque Content-Type (em vez de Accept) é o cabeçalho que deve ser definido neste caso.
Goran
4
Para aqueles que estão se perguntando, [JSON] é simplesmente um marcador para a string JSON. Não adicione colchetes extras ao redor da string JSON.
Mihai Todor
89

Embora a postagem original tenha outros problemas (ou seja, falta o "-d"), a mensagem de erro é mais genérica.

curl: (3) [globbing] colchetes aninhados não são suportados na pos X

Isso ocorre porque as chaves {} e os colchetes [] são caracteres globbing especiais em curl. Para desligar esse globbing, use a opção " -g ".

Por exemplo, a seguinte consulta de faceta Solr falhará sem o "-g" para desativar o curl globbing : curl -g 'http://localhost:8983/solr/query?json.facet={x:{terms:"myfield"}}'

Yonik
fonte
3
Essa foi a solução correta para mim, usando -gfuncionou conforme o esperado. Obrigado @Yonik
arjones
2
Meu Deus, tenho procurado uma solução para meu problema de curl GraphQL e isso me ajudou. Awesomesauce.
NetOperator Wibby
39

Deve ser mencionado que o Acceptcabeçalho diz ao servidor algo sobre o que estamos aceitando de volta, enquanto o cabeçalho relevante neste contexto éContent-Type

Geralmente, é aconselhável especificar Content-Typecomo application/jsonao enviar JSON. Para curl, a sintaxe é:

-H 'Content-Type: application/json'

Portanto, o comando curl completo será:

curl -H 'Content-Type: application/json' -H 'Accept: application/json' -X PUT -d '{"tags":["tag1","tag2"],"question":"Which band?","answers":[{"id":"a0","answer":"Answer1"},{"id":"a1","answer":"answer2"}]}' http://example.com/service`
magnata
fonte
2

Tente usar aspas simples em vez de aspas duplas junto com -g

O seguinte cenário funcionou para mim

curl -g -d '{"collection":[{"NumberOfParcels":1,"Weight":1,"Length":1,"Width":1,"Height":1}]}" -H "Accept: application/json" -H "Content-Type: application/json" --user [email protected]:123456 -X POST  https://yoururl.com

COM

curl -g -d "{'collection':[{'NumberOfParcels':1,'Weight':1,'Length':1,'Width':1,'Height':1}]}" -H "Accept: application/json" -H "Content-Type: application/json" --user test@testmail.com:123456 -X POST  https://yoururl.com

Isso resolveu especialmente meu erro de erro de comando curl: url inválido dois pontos é o primeiro caracter

vibs2006
fonte