with tutorial simple scotch rails only elaborando create crear con apis ruby-on-rails json xml binary

ruby-on-rails - simple - rails api tutorial



¿Enviar datos binarios a(Rails) RESTful endpoint a través de JSON/XML? (4)

Actualmente estoy armando una aplicación web basada en rieles que solo servirá y recibirá datos a través de json y xml. Sin embargo, algunos requisitos contienen la capacidad de cargar datos binarios (imágenes).

Ahora, a mi entender, JSON no está pensado para eso ... ¿pero cómo resuelve en general el problema de recibir archivos binarios / datos sobre esos dos puntos de entrada en su aplicación?



tal vez podrías echarle un vistazo al algoritmo Base64 . Esto se usa para "transformar" todo en ascii char. Puedes codificarlo y decodificarlo. Se usa para servicios web, o incluso en serialización dotnet.

Espero que esto ayude un poco.

Editar: Vi "nueva publicación", mientras escribía, alguien era más rápido. Rieles base64


Si está utilizando Rails y json y xml, entonces está utilizando HTTP. "POST" es una parte de HTTP y es la mejor manera de transformar datos binarios. Base64 es una forma muy ineficiente de hacer esto.

Si su servidor está enviando datos, le recomendaría poner una ruta al archivo en el servidor en XML o JSON. De esta forma, su servidor no tiene que codificar64 base64 y su cliente, que ya es compatible con HTTP GET, puede desplegar los datos sin descodificarlos. (GET / ruta / a / archivo)

Para enviar archivos, haga que su servidor y / o cliente generen un nombre de archivo único y utilicen un proceso de dos pasos; el cliente enviará el mensaje xml o json con fileToBeUploaded: "nombre de archivo.ext" y después de enviar el mensaje, PUBLICARÁ los datos con el nombre de archivo mencionado anteriormente. Nuevamente, el cliente y el servidor no tendrán que codificar ni decodificar los datos. Esto se puede hacer con una solicitud usando una solicitud de varias partes.

Base64 es fácil, pero masticará rápidamente la CPU y / o la memoria dependiendo del tamaño de los datos y la frecuencia de las solicitudes. En el lado del servidor, tampoco es una operación que se almacena en caché mientras que la operación de su servidor web es la lectura del archivo del disco.


Si sus imágenes no son demasiado grandes, ponerlas en la base de datos con un RoR: tipo binario tiene mucho sentido. Si tiene réplicas de bases de datos, las imágenes se copian gratis a los otros sitios, no hay preocupación por las imágenes huérfanas o viudas, y los problemas de transacción atómica se vuelven mucho más simples.

Por otro lado, Nessence tiene razón en que Base64, como con cualquier capa de codificación, agrega carga de red, memoria y CPU a las transacciones. Si el ancho de banda de la red es su principal problema, asegúrese de que su servicio web acepte y ofrezca conexiones desinfladas / gzip comprimidas. Esto reducirá el costo de los datos de Base64 en la capa de red, aunque a costa de aún más memoria y carga de CPU.

Estos son problemas arquitectónicos que deberían discutirse con su equipo y / o cliente.

Finalmente, permítanme que les avise sobre el soporte XML REST de RoR. The Rails :binary tipo de base de datos :binary se convertirá en <object type="binary" encoding="base64">...</object> XML cuando se procesa en XML usando un código como este del andamio predeterminado:

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

Esto funciona muy bien para operaciones GET, y las operaciones PUT y POST son casi tan fáciles de escribir. El truco es que las operaciones PUT de Rails y POST no aceptan las mismas etiquetas. Esto se debe a que el código from_xml no interpreta la etiqueta type="binary" , sino que busca type="binaryBase64" . Hay un error con un parche en el sitio del faro de Rails para corregir esto.