Jak przekazać ładunek za pomocą pliku JSON do zwijania?


201

Mogę pomyślnie utworzyć miejsce, curlwykonując następujące polecenie:

$ 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 \
"

Serwer powraca HTTP/1.1 201 Created.
Teraz chcę zapisać ładunek w pliku JSON, który wygląda następująco:

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

Więc modyfikuję polecenie do wykonania w następujący sposób:

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

To nie powraca HTTP/1.1 401 Unauthorized. Czemu?


1
Pamiętaj również, że jeśli przesyłasz pliki binarne, powinieneś użyć --data-binary.
AhmetB - Google

Odpowiedzi:


329

curlwysyła żądania POST z domyślnym typem zawartości application/x-www-form-urlencoded. Jeśli chcesz wysłać żądanie JSON, musisz podać poprawny nagłówek typu zawartości:

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

Ale to zadziała tylko wtedy, gdy serwer zaakceptuje dane wejściowe json. Na .jsonkońcu adresu URL może wskazywać tylko, że dane wyjściowe to json, niekoniecznie oznacza to, że będzie również obsługiwał dane wejściowe json . Dokumentacja API powinna dać ci wskazówkę, czy tak jest, czy nie.

Przyczyną pojawienia się 401błędu, a nie innego błędu, jest prawdopodobnie fakt, że serwer nie może wyodrębnić auth_tokenżądania z żądania.


8
Próbowałem użyć cat file.jsonpo -di miałem z tym problem, dopóki nie nauczyłem się z tej odpowiedzi, że mogę użyć @file.json. Dzięki :)
shadi

1
zwróć uwagę, że jeśli potrzebujesz wielu nagłówków, musisz określić -H/ --headerwiele razy, przynajmniej podczas testowania w bash na Ubuntu.
Chaim Eliyah,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.