Как передать полезную нагрузку через файл JSON для завивки?

Я могу успешно создать место через 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

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 из вашего запроса.