Как передать полезную нагрузку через JSON-файл для curl?
Я могу успешно создать место через 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
, Зачем?
3 ответа
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
по вашему запросу.
Чтобы уточнить, как на самом деле указать файл , содержащий JSON для публикации, обратите внимание, что он с
@
подпишите, как показано в OP
например, типичный пост для локального .NET Core API:
curl -X POST https://localhost:5001/api -H "Content-Type: application/json" -d @/some/directory/some.json
Вы можете содержимое
json
файл через
--data-raw
параметр
curl 'https://api.com/route' -H 'Content-Type: application/json' --data-raw "$(cat ~/.json/payload-2022-03-03.json | grep -v '^\s*//')"
Примечание: комментарии в файле json отфильтровываются через
grep -v '^\s*//'
Вы также можете передать данные в
curl
с помощью
stdin
с использованием
grep
или же
cat
grep -v '^\s*//' ~/.json/payload-2022-03-03.json | curl 'https://api.com/route' -H 'Content-Type: application/json' -d @-
cat ~/.json/payload-2022-03-03.json | grep -v '^\s*//' | curl 'https://api.com/route' -H 'Content-Type: application/json' -d @-