En el mundo digital actual, una experiencia de usuario fluida e intuitiva es clave para el éxito de cualquier aplicación web. Una parte fundamental de esta experiencia es proporcionar a los usuarios un acceso sencillo a diversos recursos, ya sean documentos, imágenes u otros tipos de datos. Para que esto sea posible, su servidor debe gestionar y entregar diferentes formatos de contenido de manera eficiente.
Con la nueva funcionalidad REST del servidor 4D, gestionar la entrega de contenidos diversos es ahora más fácil que nunca. Anteriormente, el servidor REST sólo podía devolver datos escalares, de entidad o de selección de entidad. Ahora, puede entregar directamente contenido web completo – un contenido listo para ser manejado por un navegador.
Descargar archivos o recibir datos binarios del servidor REST es ahora muy sencillo gracias a la nueva clase OutgoingMessage. Con ella, puede personalizar fácilmente las respuestas para adaptarlas a sus necesidades.
Siga leyendo para explorar cómo la clase OutgoingMessage puede mejorar su aplicación.
Clase HDI_OutGoingMessageClass
LlamaR a una función expuesta en el servidor REST
Recordatorio rápido: las funciones del modelo de datos ORDA y las funciones singleton se pueden llamar como API REST. Para refrescar la memoria, de un vistazo a esta entrada de blog y esta otra.
Hasta ahora, el servidor REST podía devolver varios tipos de resultados – escalares, entidades o selecciones de entidades – envueltos dentro de un objeto usando la propiedad result.
ejemplo
Esta es la función getSomeInfo() en la clase Datastore.
exposed Function getSomeInfo() : Text
return "This is the info"
Y aquí está el resultado obtenido cuando se llama con la petición /rest/$catalog/getSomeInfo:
{
"result": "This is the info"
}
Los comandos 4D Web no pueden ser utilizados en tales funciones, es por eso que la nueva clase OutgoingMessage viene con un gran beneficio.
La nueva clase OutgoingMessage
El modelo de datos ORDA y las funciones singletons ahora pueden devolver una instancia de objeto de esta nueva clase OutgoingMessage.
Tales objetos son manejados directamente por cualquier navegador como contenido web.
Así, puedes proponer a tus usuarios finales funcionalidades como la descarga de archivos e imágenes y la recepción de cualquier tipo de contenido a través de un navegador.
Esta es la representación JSON de una instancia de objeto de la clase OutgoingMessage
ejemplo
En este ejemplo, la función getFile() está implementada en la clase Datastore. El objetivo es devolver el archivo testFile.pdf como respuesta a la solicitud.
Se crea una instancia de objeto de la clase OutgoingMessage.
El cuerpo contiene el contenido binario del archivo testFile. pdf y un encabezado que indica que se ha establecido el tipo de contenido.
exposed onHTTPGet Function getFile() : 4D.OutgoingMessage
var $result:=4D.OutgoingMessage.new()
var $file:=File("/RESOURCES/testFile.pdf")
$result.setBody($file.getContent()) // This is binary content
$result.setHeader("Content-Type"; "application/pdf")
return $result
La clase OutgoingMessage contiene tres propiedades para llenar según sus necesidades:
-
- header: define cualquier encabezado HTTP que el cliente esté obligado a manejar(por ejemplo, content-type para indicar el tipo de contenido del cuerpo).
-
- body: define el contenido que quiere enviar como respuesta a la petición. Puede ser una cadena o un Blob (por ejemplo, archivo, documento o imagen como contenido binario).
-
- Estado: define cualquier código de estado HTTP de acuerdo con el resultado de la petición procedida. Esto ofrece al cliente información sobre cómo ha ido la petición (por ejemplo, estado 403 si la petición es rechazada). El valor por defecto es 200.
N.B. Las propiedades body y status pueden verse afectadas con el operador := o con el correspondiente operador setBody() / setStatus() correspondiente.
facilitar la llamada de funciones en el servidor de rePOS
la nueva palabra clave onHTTPGet para las funciones
Hasta ahora, las llamadas a funciones (de clases del modelo de datos ORDA y singletons) a través del servidor REST tenían que hacerse con un verbo POST. Esto se hacía por razones de seguridad para evitar ejecutar código sensible a través de una acción tan simple como hacer clic en un enlace.
Dado que el POST no siempre se ajusta a la experiencia de usuario que se quiere ofrecer, esas funciones también se pueden llamar con un verbo GET, es decir, invocables introduciendo una URL en un navegador.
Para ello, utilice la palabra clave new onHTTPGet para ello. Si esta palabra clave se aplica a una función, ésta también podrá invocarse con un verbo GET.
ejemplo
exposed onHTTPGet Function getSomeInfo() : 4D.OutgoingMessage
N.B. Dado que este tipo de llamada es una acción fácil de ofrecer, el desarrollador debe asegurarse de que no se realiza ninguna acción sensible en este tipo de funciones.
pasar parámetros
Los parámetros pueden pasarse a la función con el parámetro $params (debe estar encerrado en una colección).
ejemplo
En este ejemplo, se llama a la función getThumbnail() de la clase de datos Products (para obtener una foto en miniatura de un producto dado).
Recibe el nombre del producto y el ancho + longitud requeridos.
IP:port/rest/Products/getThumbnail?$params='["Yellow Pack",200,200]'
Consulte la documentación para obtener más información sobre el envío de parámetros al llamar a una función.
Un ejemplo completo
Este es el caso de uso de este ejemplo: se propone a un usuario final un enlace para descargar el manual de usuario de un producto seleccionado con varios formatos disponibles.
La petición detrás del enlace es IP:port/rest/Products/getUserManual?$params='[1, «pdf»]’
Se pasa como parámetro el id del producto seleccionado (1) y el formato requerido (pdf).
Se llama a la función getUserManual() de la clase de datos Products. Recibe como parámetro el identificador del producto y el formato.
Se recupera el documento correspondiente. Su contenido binario se pone como cuerpo en la respuesta con el tipo de contenido correspondiente.
exposed onHTTPGet Function getUserManual($productId : Integer; $type : Text) : 4D.OutgoingMessage
var $file : 4D.File
var $response:=4D.OutgoingMessage.new()
var $doc:="/RESOURCES/User manuals/product_"+String($productId)
Case of
: ($type="pdf")
$file:=File($doc+".pdf")
$response.setBody($file.getContent()) // This is binary content
$response.setHeader("Content-Type"; "application/pdf")
: ($type="jpeg")
$file:=File($doc+".jpeg")
$response.setBody($file.getContent()) // This is binary content
$response.setHeader("Content-Type"; "image/jpeg")
End case
return $response
Este es el escenario reproducido en un navegador:
Pruébelo usted mismo
Descargue el IDH para explorar esta nueva función y consulte la documentación para obtener más detalles sobre el uso de la clase OutgoingMessage en sus aplicaciones web.