¿Cómo pasar la carga útil a través de un archivo JSON para curl?
Puedo crear un lugar con éxito curl
ejecutando 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é?
curl
enví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 .json
final 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 401
error y no otro es probablemente porque el servidor no puede extraerlo auth_token
de su solicitud.
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