Jak umieścić obiekt JSON z tablicą przy użyciu curl

97

Mam szereg danych do wprowadzenia do bazy danych. Interfejs użytkownika do wprowadzania danych nie nadaje się do wprowadzania zbiorczego, więc próbuję sformułować odpowiednik w wierszu poleceń. Kiedy sprawdzam żądanie sieciowe interfejsu użytkownika w przeglądarce Chrome, widzę żądanie PUT obiektu json. Kiedy próbuję powtórzyć żądanie

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`

Pojawia się błąd

curl: (3) [globbing] nawiasy zagnieżdżone nie są obsługiwane w pozycji X

Gdzie X to pozycja znaku pierwszego „[”.

Jak mogę umieścić obiekt json zawierający tablicę?

Miles Libbey
źródło

Odpowiedzi:

151

Twoja linia poleceń powinna mieć -d / - dane wstawione przed ciągiem, który chcesz wysłać w PUT, i chcesz ustawić typ zawartości, a nie akceptować.

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

Używając dokładnych danych JSON z pytania, pełna linia poleceń wyglądałaby następująco:

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

Uwaga: dane JSON opakowane tylko dla czytelności, nieważne dla curlżądania.

Daniel Stenberg
źródło
4
-1, ponieważ Content-Type (zamiast Accept) jest nagłówkiem, który należy ustawić w tym przypadku.
Goran,
4
Dla tych, którzy się zastanawiają, [JSON] jest po prostu symbolem zastępczym dla ciągu JSON. Nie dodawaj dodatkowych nawiasów kwadratowych wokół swojego ciągu JSON.
Mihai Todor
92

Chociaż oryginalny post miał inne problemy (np. Brakujące „-d”), komunikat o błędzie jest bardziej ogólny.

curl: (3) [globbing] nawiasy zagnieżdżone nie są obsługiwane w pozycji X

Dzieje się tak, ponieważ nawiasy klamrowe {} i nawiasy kwadratowe [] są specjalnymi znakami globalizującymi w curl. Aby wyłączyć to globowanie, użyj opcji „ -g ”.

Na przykład następujące zapytanie aspektu Solr nie powiedzie się bez opcji „-g” wyłączającej globowanie curl : curl -g 'http://localhost:8983/solr/query?json.facet={x:{terms:"myfield"}}'

Yonik
źródło
4
To było dla mnie właściwe rozwiązanie, używanie -gdziałało zgodnie z oczekiwaniami. Dzięki @Yonik
arjones
3
Mój Boże, szukałem rozwiązania mojego problemu z curl w GraphQL i to mi pomogło. Niesamowity sos.
NetOperator Wibby
39

Należy wspomnieć, że Acceptnagłówek mówi serwerowi coś o tym, co przyjmujemy z powrotem, podczas gdy odpowiedni nagłówek w tym kontekście jestContent-Type

Często zaleca się określenie, Content-Typejak application/jsonpodczas wysyłania JSON. Składnia curl wygląda następująco:

-H 'Content-Type: application/json'

Więc kompletne polecenie curl będzie wyglądać następująco:

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`
potentat
źródło
2

Spróbuj użyć pojedynczego cudzysłowu zamiast podwójnych cudzysłowów wraz z opcją -g

Poniższy scenariusz zadziałał dla mnie

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

Z

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

To szczególnie rozwiązało mój błąd polecenia curl: zły dwukropek adresu URL to pierwszy znak

vibs2006
źródło