2016-11-22 3 views
1

мне нужно отправить .json файла на сервер с REST API с рецептом шеф-повара, после Chef's documentation я придумал этот код:Создание запроса POST с шеф-

http_request '/tmp/bpp.json' do 
    url 'http://localhost:8080/api/v1/blueprints/bpp' 
    headers ({ 
    'AUTHORIZATION' => "BasiC#{Base64.encode64(user)}", 
    'CONTENT-TYPE' => 'aplication/json' 
    }) 
    action :post 
end 

Для жетоном авторизации, user это переменная, которая содержит 'user:password'

Когда я запускаю этот рецепт шеф-я получить следующий ответ:

Error executing action `post` on resource 'http_request[POST /tmp/bpp.json]' 

Net::HTTPServerException 
------------------------ 
400 "Bad Request" 

до этого я ж как только выполнение вызова curl, и он работал нормально, но мне нужно перейти на ресурс http_request. Это был старый (рабочий) curl запрос:

curl --user user:password -H 'X-Requested-By:My-cookbook' --data @/tmp/bpp.json localhost:8080/api/v1/blueprints/bpp 

Я не очень привык с REST APIs и походит на неизведанную территорию для меня.

ответ

1

Вы забываете о message. Использование имени файла в качестве имени ресурса не будет отправлять этот файл в виде данных. Попробуйте добавить:

... 
message lazy { IO.read('/tmp/bpp.json') } 
... 

В вашем случае только имя ресурса - /tmp/bpp.json, будет отправлено. Не содержимое файла. Как указано в связанном документ:

The message that is sent by the HTTP request. Default value: the name of the resource block See “Syntax” section above for more information. 
+0

О, я вижу это ясно теперь, вместо файла в пути '/ TMP/bpp.json', что я послал это строка'/TMP/bpp.json' Есть ли элегантный/простой способ передать файл как сообщение здесь? Должен ли он (каким-либо образом) загружаться во время работы шеф-повара в память? – Navarro

+0

Это зависит, вы можете попробовать прочитать файл во время выполнения chef (File.read). но помните, что чистый код ruby ​​[выполнен на этапе компиляции] (https://coderanger.net/two-pass/). Поэтому, если вы хотите разместить этот файл на сервере с помощью шеф-повара, вам придется использовать ленивый блок. Вы также можете поместить этот файл в пакет данных. –

+1

Я сделал пример более конкретным. – coderanger