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

Resuelto JJD asked hace 11 años • 3 respuestas

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 regresa 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 no regresa HTTP/1.1 401 Unauthorized. ¿Por qué?

JJD avatar Sep 04 '13 17:09 JJD
Aceptado

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 del tipo de contenido correcto:

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

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

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

mata avatar Sep 04 '2013 12:09 mata

Para aclarar cómo especificar realmente un archivo que contiene el JSON para publicar, tenga en cuenta que tiene el @signo que se muestra en el OP.

por ejemplo, una publicación típica en una API .NET Core local:

curl -X POST https://localhost:5001/api -H "Content-Type: application/json" -d @/some/directory/some.json

Chris Halcrow avatar Jun 01 '2021 06:06 Chris Halcrow