Cómo poner un objeto json con una matriz usando curl

94

Tengo una serie de datos para ingresar a la base de datos. La interfaz de usuario para ingresar los datos no es buena para la entrada masiva, así que estoy tratando de formular un equivalente de línea de comando. Cuando examino la solicitud de red de la interfaz de usuario en Chrome, veo una solicitud PUT de un objeto json. Cuando intento replicar la solicitud

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`

Me sale un error

curl: (3) [globbing] tirantes anidados no compatibles en la posición X

Donde X es la posición del carácter del primer "[".

¿Cómo puedo PONER un objeto json que incluye una matriz?

Miles Libbey
fuente

Respuestas:

147

Su línea de comando debe tener un -d / - datos insertados antes de la cadena que desea enviar en el PUT, y desea establecer el Tipo de contenido y no Aceptar.

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

Usando los datos JSON exactos de la pregunta, la línea de comando completa se convertiría en:

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
fuente
4
-1 porque Content-Type (en lugar de Accept) es el encabezado que debe establecerse en este caso.
Goran
3
Para aquellos que se preguntan, [JSON] es simplemente un marcador de posición para la cadena JSON. No agregue corchetes adicionales alrededor de su cadena JSON.
Mihai Todor
89

Aunque la publicación original tenía otros problemas (es decir, falta la "-d"), el mensaje de error es más genérico.

curl: (3) [globbing] tirantes anidados no compatibles en la posición X

Esto se debe a que las llaves {} y los corchetes [] son ​​caracteres globales especiales en curl. Para desactivar este globbing, use la opción " -g ".

Por ejemplo, la siguiente consulta de facetas de Solr fallará sin el "-g" para desactivar el globbing de curl : curl -g 'http://localhost:8983/solr/query?json.facet={x:{terms:"myfield"}}'

Yonik
fuente
3
Esta fue la solución correcta para mí, el uso -gfuncionó como se esperaba. Gracias @Yonik
arjones
2
Dios mío, he estado buscando una solución a mi problema de curvatura GraphQL y esto me ayudó. Salsa impresionante.
NetOperator Wibby
39

Cabe mencionar que el Acceptencabezado le dice al servidor algo sobre lo que estamos aceptando, mientras que el encabezado relevante en este contexto esContent-Type

A menudo es recomendable especificar Content-Typecomo application/jsonal enviar JSON. Para curl, la sintaxis es:

-H 'Content-Type: application/json'

Entonces el 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`
magnate
fuente
2

Intente usar comillas simples en lugar de comillas dobles junto con -g

El siguiente escenario funcionó para mí

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

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

Esto resolvió especialmente mi error de comando curl error: url incorrecta dos puntos es el primer carácter

vibs2006
fuente