¿Cómo pasar la carga útil a través del archivo JSON para curl?

201

Puedo crear un lugar con éxito curlejecutando el siguiente comando:

$ curl -vX POST https://server/api/v1/places.json -d "
  auth_token=B8dsbz4HExMskqUa6Qhn& \
  place[name]=Fuelstation Central& \
  place[city]=Grossbeeren& \
  place[address]=Buschweg 1& \
  place[latitude]=52.3601& \
  place[longitude]=13.3332& \
  place[washing]=true& \
  place[founded_at_year]=2000& \
  place[products][]=diesel& \
  place[products][]=benzin \
"

El servidor vuelve HTTP/1.1 201 Created.
Ahora quiero almacenar la carga útil en un archivo JSON que se ve así:

// testplace.json
{
  "auth_token" : "B8dsbz4HExMskqUa6Qhn",
  "name" : "Fuelstation Central",
  "city" : "Grossbeeren",
  "address" : "Buschweg 1",
  "latitude" : 52.3601,
  "longitude" : 13.3332,
  "washing" : true,
  "founded_at_year" : 2000,
  "products" : ["diesel","benzin"]
}

Entonces modifico el comando para que se ejecute así:

$ curl -vX POST http://server/api/v1/places.json -d @testplace.json

Esto falla al regresar HTTP/1.1 401 Unauthorized. ¿Por qué?

JJD
fuente
1
También tenga en cuenta que si está cargando archivos binarios, debe usarlos --data-binary.
AhmetB - Google

Respuestas:

329

curlenvía solicitudes POST con el tipo de contenido predeterminado de application/x-www-form-urlencoded. Si desea enviar una solicitud JSON, deberá especificar el encabezado de tipo de contenido correcto:

$ curl -vX POST http://server/api/v1/places.json -d @testplace.json \
--header "Content-Type: application/json"

Pero eso solo funcionará si el servidor acepta la entrada json. El .jsonfinal de la url solo puede indicar que la salida es json, no necesariamente significa que también manejará la entrada json . La documentación de la API debería darle una pista sobre si lo hace o no.

La razón por la que obtiene un 401error y no otro es probablemente porque el servidor no puede extraerlo auth_tokende su solicitud.

mata
fuente
8
Intenté usarlo cat file.jsondespués -dy tuve problemas con él, hasta que aprendí de esta respuesta que puedo usar @file.json. Gracias :)
shadi
1
Tenga en cuenta que si necesita varios encabezados, debe especificar -H/ --headervarias veces, al menos cuando se prueba en bash en Ubuntu.
Chaim Eliyah