2013-09-04 2 views
97

я могу успешно создать место через curl, выполнив следующую команду:Как передать полезную нагрузку через файл JSON для завивки?

$ 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. Зачем?

ответ

158

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

+0

Я пытался использовать 'cat file.json' после' -d' и имел проблемы с ним, пока не узнал из этого ответа, что могу использовать '@ file.json'. Спасибо :) – shadi

+0

@mata Можете ли вы посмотреть на вопрос [http://stackoverflow.com/questions/42021113/how-to-use-curl-to-access-the-github-graphql-api] –

+0

, обратите внимание, что если вам нужно несколько заголовков, вам нужно несколько раз указывать '-H' /' --header', по крайней мере, при тестировании в bash на Ubuntu. –