Mogę pomyślnie utworzyć miejsce, curl
wykonują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?
--data-binary
.Odpowiedzi:
curl
wysyła żądania POST z domyślnym typem zawartościapplication/x-www-form-urlencoded
. Jeśli chcesz wysłać żądanie JSON, musisz podać poprawny nagłówek typu zawartości:Ale to zadziała tylko wtedy, gdy serwer zaakceptuje dane wejściowe json. Na
.json
koń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ę
401
błędu, a nie innego błędu, jest prawdopodobnie fakt, że serwer nie może wyodrębnićauth_token
żądania z żądania.źródło
cat file.json
po-d
i miałem z tym problem, dopóki nie nauczyłem się z tej odpowiedzi, że mogę użyć@file.json
. Dzięki :)-H
/--header
wiele razy, przynajmniej podczas testowania w bash na Ubuntu.