Как передать полезную нагрузку через 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. Спасибо :)
Шади

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