Ruby — загрузка файла с использованием сообщения RestClient

У меня есть cURL, который я пытаюсь перевести на Ruby.

cURL таков:

curl -i -k -H "Accept: application/json" -H "Authorization: token" -H "Content-Type: image/jpeg" -H "Content-Length: 44062" --data-binary "gullfoss.jpg" http://www.someurl.com/objects

Мой код Ruby таков:

image = File.read('uploads/images/gullfoss.jpg')
result = RestClient.post('http://www.someurl.com/objects',image,{'upload' => image, 'Accept' => 'application/json', 'Authorization' => 'token', 'Content-Type' => 'image/jpeg', 'Content-Length' => '44062'})

Код Ruby возвращает мне 400 Bad Request. Это не проблема с авторизацией или другими заголовками. Я думаю, что проблема заключается в переводе --data-binary на Ruby.

Любая помощь приветствуется.

Спасибо, Адриан


person Adrian    schedule 21.05.2012    source источник
comment
В моем примере я устанавливаю данные сообщения для изображения, но я также пытался оставить это поле пустым.   -  person Adrian    schedule 21.05.2012
comment
Попробуйте image = File.open('uploads/images/gullfoss.jpg','rb') {|io| io.read}   -  person Anand Shah    schedule 21.05.2012
comment
stackoverflow.com/questions/2863164/   -  person Anand Shah    schedule 21.05.2012


Ответы (1)


Есть несколько вещей, которые могут вызвать проблему.

  1. Вы хотите использовать реальный объект File с RestClient, поэтому используйте File.open; он возвращает файловый объект.
  2. Вы дважды включаете объект изображения в свой запрос; фактическое содержание не ясно из вашего вопроса. Например, вы смешиваете элементы полезной нагрузки с заголовками. На основе подписи RestClient.post, которая принимает аргументы url, payload, headers={}, ваш запрос должен иметь одну из двух следующих форм:

Ожидает ли конечная точка именованные параметры? Если да, то используйте следующее:

Метод 1: полезная нагрузка включает поле или параметр с именем "загрузка", а значение устанавливается в объект изображения.

result = RestClient.post(
  'http://www.someurl.com/objects',
  { 'upload' => image },
  'Accept' => 'application/json',
  'Authorization' => 'token',
  'Content-Type' => 'image/jpeg',
)

Ожидает ли конечная точка простую загрузку файла? Если это так, используйте:

Метод 2: объект файла изображения отправляется в качестве единственной полезной нагрузки.

result = RestClient.post(
  'http://www.someurl.com/objects',
  image,
  'Accept' => 'application/json',
  'Authorization' => 'token',
  'Content-Type' => 'image/jpeg',
)

Обратите внимание, что я не включил заголовок 'Content-Length'; это обычно не требуется при использовании RestClient, потому что он вставляет его для вас при обработке файлов.

Существует еще один способ отправки полезной нагрузки с RestClient объясненным ">здесь.

Не забудьте также прочитать официальную документацию на github.

Я также новичок в RestClient, поэтому, если я ошибаюсь в этом случае, не будьте слишком строги; Я немедленно исправлю все свои заблуждения. Надеюсь это поможет!

person Steve Benner    schedule 04.03.2014