Як передати корисну навантаження через файл JSON для curl?


201

Я можу успішно створити місце за допомогою curlвиконання наступної команди:

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

Сервер повертається HTTP/1.1 201 Created.
Тепер я хочу зберігати корисне навантаження у файлі JSON, який виглядає приблизно так:

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

Тому я змінюю команду, яку потрібно виконати так:

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

Це не вдається повернутись HTTP/1.1 401 Unauthorized. Чому?


1
Також пам’ятайте, що якщо ви завантажуєте двійкові файли, ви повинні використовувати --data-binary.
AhmetB - Google

Відповіді:


329

curlнадсилає POST-запити з типовим вмістом типу application/x-www-form-urlencoded. Якщо ви хочете надіслати запит JSON, вам доведеться вказати правильний заголовок типу вмісту:

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

Але це буде працювати лише в тому випадку, якщо сервер прийме json введення. .jsonВ кінці URL - адреса може тільки вказати , що вихід є JSON, це не обов'язково означає , що він також буде обробляти JSon вхід . Документація API повинна дати вам підказку щодо того, чи це так чи ні.

Причина, за якою ви отримуєте 401помилку, а не якусь іншу помилку, ймовірно, полягає в тому, що сервер не може витягнути це auth_tokenз вашого запиту.


8
Я намагався використовувати cat file.jsonпісля -dі не мав проблем з цим, поки не дізнався з цієї відповіді, що я можу використовувати @file.json. Дякую :)
shadi

1
зауважте, що якщо вам потрібно кілька заголовків, вам потрібно вказати -H/ --headerкілька разів, принаймні під час тестування в bash на Ubuntu.
Хаїм Елія
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.