Отправка двоичных данных в (Rails) конечную точку RESTful через JSON / XML? - PullRequest
6 голосов
/ 09 января 2009

В настоящее время я собираю веб-приложение на основе рельсов, которое будет обслуживать и получать данные только через json и xml. Однако некоторые требования содержат возможность загрузки двоичных данных (изображений).

Теперь, насколько я понимаю, JSON не предназначен для этого ... но как вы вообще решаете проблему получения двоичных файлов / данных через эти две точки входа в ваше приложение?

Ответы [ 4 ]

9 голосов
/ 09 января 2009

Я предлагаю кодировать двоичные данные в нечто вроде base64. Это сделает его безопасным для использования в формате XML или JSON.

http://en.wikipedia.org/wiki/Base64

5 голосов
/ 09 января 2009

возможно, вы могли бы взглянуть на алгоритм Base64 . Это используется для "преобразования" всего в ascii char. Вы можете кодировать и декодировать его. Он используется для веб-сервисов или даже для сериализации dotnet.

Надеюсь, это немного поможет.

Редактировать: я видел "новое сообщение", когда публиковал, кто-то был быстрее.

4 голосов
/ 19 мая 2009

Если вы используете Rails, json и xml, чем HTTP. «POST» является частью HTTP и является лучшим способом преобразования двоичных данных. Base64 - очень неэффективный способ сделать это.

Если ваш сервер отправляет данные, я бы рекомендовал указать путь к файлу на сервере в формате XML или JSON. Таким образом, вашему серверу не нужно кодировать данные в base64, а ваш клиент, который уже поддерживает HTTP GET, может извлекать данные, не декодируя их. (GET / путь / к / файлу)

Для отправки файлов попросите ваш сервер и / или клиента сгенерировать уникальное имя файла и использовать двухэтапный процесс; клиент отправит сообщение xml или json с fileToBeUploaded: "name of file.ext" и после отправки сообщения отправит POST данные с указанным именем файла. Опять же, клиенту и серверу не придется кодировать и декодировать данные. Это можно сделать одним запросом, используя запрос из нескольких частей.

Base64 - это просто, но он будет быстро жевать процессор и / или память в зависимости от размера данных и частоты запросов. На стороне сервера это также не операция, которая кэшируется, в то время как операция вашего веб-сервера, считывающая файл с диска.

2 голосов
/ 18 августа 2009

Если ваши изображения не слишком большие, их размещение в базе данных с двоичным типом RoR: имеет большой смысл. Если у вас есть реплики базы данных, изображения бесплатно копируются на другие сайты, нет проблем с потерянными или овдовевшими изображениями, а проблемы атомарных транзакций становятся намного проще.

С другой стороны, Nessence прав, что Base64, как и любой другой уровень кодирования, добавляет к транзакциям нагрузку на сеть, память и ЦП. Если пропускная способность сети является вашей главной проблемой, убедитесь, что ваша веб-служба принимает и предлагает сжатые соединения с раздувом / gzip. Это снизит стоимость данных Base64 на сетевом уровне, хотя и за счет увеличения больше памяти и загрузки процессора.

Это архитектурные проблемы, которые следует обсудить с вашей командой и / или клиентом.

Наконец, позвольте мне напомнить вам о поддержке RoR XML REST. Тип базы данных Rails :binary станет <object type="binary" encoding="base64">...</object> объектами XML при рендеринге в XML с использованием кода, подобного следующему из стандартных скаффолдингов:

def show
  @myobject = MyObject.find(:id)
  respond_to do |format|
    format.xml { render => @myobject }
  end
end

Это прекрасно работает для операций GET, а операции PUT и POST так же легко написать. Подвох заключается в том, что операции Rails PUT и POST не принимают одинаковые теги. Это связано с тем, что код from_xml не интерпретирует тег type="binary", а ищет type="binaryBase64". На сайте маяка Rails есть ошибка с патчем, исправляющим это.

...