Come passare il payload tramite il file JSON per curl?


201

Posso creare con successo un posto curleseguendo il seguente 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 \
"

Il server ritorna HTTP/1.1 201 Created.
Ora voglio archiviare il payload in un file JSON che assomiglia a questo:

// 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"]
}

Quindi modifico il comando da eseguire in questo modo:

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

Questo non riesce a tornare HTTP/1.1 401 Unauthorized. Perché?


1
Tieni inoltre presente che se stai caricando file binari, dovresti utilizzare --data-binary.
AhmetB - Google

Risposte:


329

curlinvia richieste POST con il tipo di contenuto predefinito di application/x-www-form-urlencoded. Se si desidera inviare una richiesta JSON, sarà necessario specificare l'intestazione del tipo di contenuto corretta:

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

Ma funzionerà solo se il server accetta input json. Alla .jsonfine dell'URL può solo indicare che l' output è json, non significa necessariamente che gestirà anche l' input json . La documentazione dell'API dovrebbe darti un suggerimento sul fatto che lo faccia o meno.

Il motivo per cui si ottiene un 401e non qualche altro errore è probabilmente perché il server non è in grado di estrarre auth_tokendalla richiesta.


8
Stavo cercando di usare cat file.jsondopo -de stavo avendo problemi con esso, fino a quando non ho imparato da questa risposta che posso usare @file.json. Grazie :)
Shadi,

1
nota che se hai bisogno di più intestazioni devi specificare -H/ --headerpiù volte, almeno quando testato in bash su Ubuntu.
Chaim Eliyah,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.