Come mettere un oggetto json con un array usando curl


95

Ho una serie di dati da inserire nel database. L'interfaccia utente per inserire i dati non è buona per l'immissione di massa, quindi sto cercando di formulare un equivalente della riga di comando. Quando esamino la richiesta di rete dell'interfaccia utente in Chrome, vedo una richiesta PUT di un oggetto json. Quando provo a replicare la richiesta

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`

Ottengo un errore

curl: (3) [globbing] parentesi graffe nidificate non supportate in posizione X

Dove X è la posizione del carattere del primo "[".

Come posso mettere un oggetto json che include un array?

Risposte:


148

La riga di comando dovrebbe avere un dato -d / - inserito prima della stringa che si desidera inviare nel PUT e si desidera impostare Content-Type e non Accept.

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

Utilizzando i dati JSON esatti della domanda, la riga di comando completa diventerebbe:

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

4
-1 perché Content-Type (invece di Accept) è l'intestazione che dovrebbe essere impostata in questo caso.
Goran

4
Per coloro che se lo stanno chiedendo, [JSON] è semplicemente un segnaposto per la stringa JSON. Non aggiungere parentesi quadre aggiuntive attorno alla stringa JSON.
Mihai Todor

89

Sebbene il post originale avesse altri problemi (ad esempio la "-d" mancante), il messaggio di errore è più generico.

curl: (3) [globbing] parentesi graffe nidificate non supportate in posizione X

Questo perché le parentesi graffe {} e le parentesi quadre [] sono caratteri speciali globbing in curl. Per disattivare questo globbing, usa l' opzione " -g ".

Ad esempio, la seguente query di facet Solr fallirà senza "-g" per disattivare il curl globbing : curl -g 'http://localhost:8983/solr/query?json.facet={x:{terms:"myfield"}}'


3
Questa è stata la soluzione corretta per me, utilizzando ha -gfunzionato come previsto. Grazie @Yonik
arjones

2
Santo cielo, ho cercato una soluzione al mio problema di ricciolo GraphQL e questo mi ha aiutato. Salsa stupenda.
NetOperator Wibby

39

Va detto che l' Acceptintestazione dice al server qualcosa su ciò che stiamo accettando, mentre l'intestazione rilevante in questo contesto lo èContent-Type

È spesso consigliabile specificare Content-Typecome application/jsonquando si invia JSON. Per curl la sintassi è:

-H 'Content-Type: application/json'

Quindi il comando curl completo sarà:

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`

2

Prova a utilizzare virgolette singole invece di virgolette doppie insieme a -g

Il seguente scenario ha funzionato per me

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

CON

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

Questo ha risolto in modo particolare il mio errore di comando curl: i due punti dell'URL errato sono il primo carattere


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.