Rails — отправка изображения с помощью Faraday

Я пытаюсь сделать запрос к API, отправляя изображение и некоторые другие данные и получая ответ. Это мой код:

file = "assets/images/test.jpg"
conn = Faraday.new(:url => "api_url" ) do |faraday|
  faraday.request :multipart
end
payload = { :profile_pic => Faraday::UploadIO.new(file, 'image/jpeg') }
conn.post "/test", payload

Моя первая проблема заключается в том, что я всегда получаю следующую ошибку:

Errno::ENOENT (No such file or directory - assets/images/test.png)

Я испробовал все пути, которые только мог себе представить. Где должно быть сохранено изображение в каталогах, которые должен найти Фарадей?

Второй вопрос касается ответа, как я могу получить ответ и обработать его?

Третий заключается в том, что я не понимаю, в чем польза первого параметра последнего вызова:

conn.post "/hello", payload

Я написал «/hello», но понятия не имею, каково его реальное использование.

И последний. Могу ли я отправить необработанное изображение, сохраненное в переменной, вместо отправки пути к Фарадею?

ИЗМЕНИТЬ

Теперь это работает, вот решение: имейте в виду, что URL-адрес должен быть только до .com, остальная часть пути должна идти по conn.post, как в этом примере /v1/search. c.adapter :net_http тоже был нужен. Ответ на сообщение правильно обрабатывается в переменной json.

Решение:

  url = 'http://url.com'

  file = Rails.root.to_s + "/app/assets/images/test.jpg"
  conn = Faraday.new(:url => url ) do |c|
    c.request :multipart
    c.adapter :net_http
  end
  payload = { :image => Faraday::UploadIO.new(file, 'image/jpeg'), :token => token}

  response = conn.post '/v1/search', payload
  json = JSON.parse response.body

person user1573607    schedule 21.11.2013    source источник


Ответы (1)


Вы должны попробовать это для своего первого вопроса:

file = Rails.root.to_s + "/app/assets/images/test.jpg"

Для вашего третьего вопроса первые параметры позволяют вам создать правильный URL-адрес из базы «api_url». См. пример из Readme.

## POST ##

conn.post '/nigiri', { :name => 'Maguro' }  # POST "name=maguro" to http://sushi.com/nigiri
person Pol0nium    schedule 21.11.2013
comment
На самом деле правильный ответ file = Rails.root.to_s + "/app/assets/images/test.jpg" Но это помогло мне его выяснить. А по остальным пунктам? Есть идеи? - person user1573607; 21.11.2013
comment
@ user1573607 Я обновил свой ответ. (Я не знаю ответа на второй вопрос. Возможно, вам следует напечатать payload[:profile_pic] после вызова conn.post и посмотреть, что вы получите?) - person Pol0nium; 21.11.2013