Aplicaciones modernas

Potencie sus aplicaciones modernas con Windows Azure Mobile Services

Rachel Appel

 

Rachel Appel Independientemente de la plataforma que tenga como objetivo para la publicación de aplicaciones, Windows Azure Mobile Services (WAMS) es un back-end para gobernarlas a todas. Es un componente clave de la plataforma Windows Azure y es el back-end para el desarrollo web y de aplicaciones modernas entre plataformas. En este artículo, cubriré la configuración de WAMS para trabajar en Visual Studio, proporcionaré una descripción general de la API de WAMS y explicaré la codificación necesaria para crear una aplicación moderna con WAMS.  

La arquitectura entre plataformas de WAMS

Hay muchos servicios de Windows Azure que puede usar para administrar datos y alimentar el back-end de una aplicación, y no es poco común que las aplicaciones consuman más de un servicio de Windows Azure. Estos son algunos de los servicios disponibles:

  • WAMS: conjunto entre plataformas, con todas las características de servicios y recursos de back-end pensado específicamente para una compilación rápida de aplicaciones.
  • SQL Azure: Este es el mismo popular SQL Server, pero en la nube, con una interfaz de administración web fácil de usar. Es rentable para startups, empresas e ISV más pequeñas.
  • Almacenamiento de tabla de Windows Azure: una manera NoSQL de trabajar con datos tabulares y a veces no tan tabulares.
  • Almacenamiento de Windows Azure Binary Large Object (BLOB): una manera altamente escalable de contener datos en pares clave/valor en la nube sin las preocupaciones ni restricciones de datos estructurados.
  • Windows Azure Web Sites: Además del hospedaje de sitios web, Windows Azure Web Sites puede ejecutar API web de ASP.NET y ASP.NET. Esta es una excelente manera de potenciar sitios web heredados, programas y aplicaciones a través de HTTP sin tener que realizar mucho trabajo arquitectónico.

La arquitectura de una aplicación dependerá de sus requisitos. Si la aplicación debe almacenar grandes cantidades (por ejemplo, decenas de cientos de gigabytes de datos) de medios o contenido binario, usar almacenamiento de Windows Azure BLOB probablemente sea una mejor opción. Para la mayoría de las aplicaciones que solo leen y escriben datos textuales con algunas imágenes como acompañamiento, WAMS es una solución directa y sencilla. Muchas aplicaciones deben tratar con datos heredados, de manera que migrar de SQL Server, SQL Server Compact (SQL CE) o cualquier otra familia de bases de datos de Microsoft SQL directo a SQL Azure podría ser la mejor ruta si necesita un administrador de base de datos para administrar los datos.

Para la mayoría de las aplicaciones, WAMS es bastante adecuado, porque no solo cuenta con almacenamiento para datos, sino que también posee un conjunto completo de servicios de back-end encima de la base de datos creado para los fines expresos de admitir escenarios de infraestructura de aplicaciones comunes como notificaciones push y autenticación.

Servicios principales de WAMS

Las siguientes características son servicios básicos de WAMS:

  • Datos: Desde luego, hospedar y manipular datos es esencial para toda aplicación, de manera que WAMS lo admite. Para cada servicio móvil, hay una base de datos SQL Azure detrás.
  • Mensajería: las notificaciones push son cada vez más importantes porque los usuarios desean mantenerse actualizados. A medida que las aplicaciones se vuelven progresivamente más complejas, intuitivas y fáciles de usar (en otras palabras, más modernas), las características como una mensajería push y comunicación en tiempo real se vuelven un lugar común. Afortunadamente, usar notificaciones push en WAMS es tan fácil como una llamada para enviar una notificación del sistema (un pequeño mensaje emergente en la esquina superior o inferior derecha del SO) como:
push.wns.sendToastText04(channel, { text1: item.text });
  • Autenticación: Proteger los datos, especialmente los datos de usuario, es tan importante como los datos en sí. Una piedra angular de las aplicaciones modernas es la autenticación mediante sitios web ampliamente populares (como Facebook o Twitter), de manera que WAMS le permite autenticarse con cualquiera de los siguientes proveedores de identidad:
  1. Cuenta Microsoft (el proveedor de autenticación antiguamente conocido como Windows Live ID)
  2. Inicio de sesión en Facebook
  3. Inicio de sesión en Twitter
  4. Inicio de sesión en Google

WAMS admite varias bibliotecas para la familia Windows de desarrollo de aplicaciones, incluida la biblioteca Windows en tiempo de ejecución (WinRT) para clientes administrados, la Biblioteca de Windows para JavaScript (WinJS) para clientes y las API de Transferencia de estado de representación (REST) para todo: servicios básicos, autenticación y mensajería. Incluso hay bibliotecas de cliente iOS y Android para paridad entre plataformas.

Use la API de WAMS en proyectos de la Tienda Windows o Windows Phone

Ya sea que esté compilando una aplicación de la Tienda Windows o Windows Phone, el código será casi idéntico y el código JavaScript es sorprendentemente similar por el lado de WinJS. Una vez que tiene las herramientas de desarrollo adecuadas y WAMS instalado y configurado (consulte bit.ly/NAAQz8 para obtener más información sobre esto), escribir el código para obtener acceso a objetos y datos en un servicio móvil es sencillo, pero diferente del tradicional desarrollo de aplicaciones cliente/servidor o de n niveles. Esto se debe a que WAMS se integra con la aplicación de tal manera que ciertos cambios en el modelo de la aplicación pueden causar cambios en las estructuras de datos subyacentes. En otras palabras, puede lanzar muchas de las instrucciones de definición tradicionales de datos SQL y simplemente modificar el miembro de una clase, recompilar, ejecutar la aplicación y comprobar los cambios en el nivel de la base de datos. Además de esto, JavaScript toma el lugar de SQL como la sintaxis de moda para el mantenimiento de la base de datos como scripts de validación o crear restricciones en los datos. Ser capaz de definir fácilmente los scripts de los cambios de la base de datos desde la aplicación, el símbolo del sistema y la herramienta de administración web acorta el proceso de compilación de la aplicación.

El espacio de nombres Microsoft.WindowsAzure.MobileServices proporciona acceso de problemas estándar a objetos en el servicio móvil o su base de datos SQL Azure subyacente. El siguiente ejemplo de código crea una instancia de MobileServiceClient:

public static MobileServiceClient MobileService = new MobileServiceClient(
  "https://your-very-own-service-url.azure-mobile.net/",
  "your-very-own-key-that-is-a-gigantic-string-of-characters-and-numbers"
);

Como puede ver, la URL y la clave de su aplicación WAMS son parámetros del constructor MobileServiceClient. Para buscar su URL y clave, inicie sesión en el portal Windows Azure y navegue a su servicio móvil, luego haga clic en el icono de la nube a la izquierda del elemento de menú panel.

En el ejemplo de código anterior, la clase MobileServiceClient se comporta de alguna manera como un objeto de conexión, pero sin esos complicados métodos de apertura y cierre de los tiempos del objeto SqlConnection. La clase MobileServiceClient administra la conectividad por usted. Si sus datos están configurados para consumo público, entonces no necesita llamar al método MobileServiceClient.login, sin embargo, puede obtener acceso a tablas, ejecutar consultar y ordenar datos. Desde luego, es posible que operaciones de seguridad más complejas requieran credenciales.

Una vez que tiene una instancia válida de una clase MobileServiceClient, puede usar GetTable<T> para interactuar con un tabla de WAMS subyacente:

private IMobileServiceTable<Person> personsTable =
  MobileService.GetTable< Person>();

El parámetro tipo T en IMobileServiceTable<T> provoca que el compilador inspeccione las propiedades y la información sobre el parámetro (en este caso la clase Person en la figura 1) al asignarlo a la tabla subyacente en el nivel de la base de datos. Esto le permite agregar o modificar propiedades durante el desarrollo y ver los cambios de esquema reflejados en la nube en tiempo de ejecución, lo cual arroja una alianza más simbiótica entre el código y la base de datos. Sin embargo, los cambios de esquema en el nivel de la base de datos no suceden de manera automática para cada cambio en el código. Por ejemplo, agregar una propiedad al código en la figura 1 crea una nueva columna en la tabla, pero eliminar una propiedad existente no provoca una eliminación.

Figura 1 Clase Person

// Data model/class code.
public class Person
{
  public int Id { get; set; }
  public string Name { get; set; }
  [DataMember(Name = "Birthday")] 
  public DateTime Date { get; set; }
  public string Picture { get; set; }
  public string Notes { get; set; }
}

GetTable<T> devuelve un objeto IMobileServiceTable que representa la tabla subyacente real en WAMS y contiene métodos para insertar, actualizar, eliminar y ordenar servicios, tal como se muestra aquí:

// Perform delete asynchronously where item is of type Person, see Figure 1.
await itemsTable.DeleteAsync(item);
// Select specific records with LINQ query
var people =
  personsTable.Select(p => p.Birthday > DateTime.Now.AddDays(14));

Puede crear su capa de datos en el código al crear una clase personalizada que haga coincidir los nombres de la tabla con los miembros. Esta técnica se conoce como convención sobre configuración, la cual es una manera de rebajar un código de configuración XML recargado en favor de continuidad y coherencia en el momento de poner los nombres, lo cual da como resultado menos código que es más fácil de mantener. Por ejemplo, la clase y el esquema en la figura 1 demuestran que el código de clase cliente se asigna a una tabla WAMS y sus miembros.

El código en la figura 1 crea el esquema de base de datos que aparece en la figura 2.

Figura 2 La convención sobre configuración hace coincidir los nombres del código de clase y del esquema de la base de datos

Columna Type
Id SQL Bigint
Name String
Fecha DateTime
Foto String
Notas String

WAMS infiere tipos de datos del tipo de datos de la propiedad en código. Algunos tipos, sin embargo, no se pueden representar con atributos de datos, específicamente datos de imagen y binarios. Esto significa que cuando desee almacenar una imagen, debe usar el almacenamiento de Windows Azure BLOB porque es más escalable, más económico y su rendimiento es mucho mejor que la alternativa, que es la codificación de Base64 en una cadena para luego almacenarlo en una tabla WAMS. El almacenamiento de Windows Azure BLOB tiene una API de REST y API administrada de manera que los desarrolladores pueden obtener acceso fácilmente a los servicios entre plataformas y preferencias.

Para realizar operaciones de inserción, actualización o eliminación, simplemente cree una instancia de su objeto personalizado y llame al método correspondiente desde su objeto IMobileServiceTable:

Person person = new Person {
  Name = "Alan Turing",
  Birthday = DateTime dte = new DateTime(1912,6,23),
  Picture = base64string, // Image encoding done elsewhere in code. 
  Notes = "A father of modern computer science. There is a test " +
    "named after him that I fail regularly"};
await personsTable.InsertAsync(person);

Como la llamada a InsertAsync es claramente asincrónica, no bloquea la ejecución del código de IU y usted puede administrar datos en segundo plano sin interferir con las actividades del usuario. Las aplicaciones de la Tienda Windows y Windows Phone funcionan de asincrónicamente de manera predeterminada, ya que no siempre puede contar con una conectividad confiable.

Si está trabajando en XAML, puede enlazar los datos de la tabla al llamar al método ToListAsync del objeto IMobileServiceTable. Este método prepara los datos y los devuelve en un objeto que enlaza las tablas WAMS fácilmente a elementos ListView de XAML, como lo demuestra el siguiente ejemplo de código:

var results = await todoTable.ToListAsync();
items = new ObservableCollection<TodoItem>(results);
ListItems.ItemsSource = items;

El código anterior es similar al código tradicional de vínculo de datos en Microsoft .NET Framework. También puede llamar métodos en el objeto IMobileServiceTable para devolver un IList<T> o IEnumerable<T> si desea crear un bucle manualmente a través de los datos, en vez de enlazar datos.

Administración de característica WAMS avanzadas

Desde luego, tendrá que administrar y mantener el servicio móvil, sus datos, seguridad y todas las tareas usuales que se incluyen en el mantenimiento del back-end, ya que no todo ese tipo de trabajo debe hacerse en la aplicación. Afortunadamente, WAMS le ofrece algunas alternativas respecto de las tareas administrativas de back-end:

  • Herramienta de línea de comandos: esto es excelente independientemente de qué plataforma use para el desarrollo; puede usar cualquier símbolo del sistema una vez que haya descargado e instalado las bibliotecas de la línea de comandos (consulte bit.ly/14Q49bi para obtener más información sobre esto).    
  • Administración web: genial para el desarrollo del back-end entre plataformas, también conocida como el portal de Windows Azure, esta herramienta le permite hacer todo lo básico en línea: crear bases de datos, ejecutar scripts del lado del servidor, administrar servicios, administrar seguridad, etcétera (se puede obtener acceso al portal desde el sitio principal de Windows Azure en bit.ly/4yqVhP).
  • SQL Server Management Studio: una herramienta de administración de bases de datos clásica de Microsoft que puede usar para conectar y administrar las bases de datos detrás de un servicio móvil (consulte bit.ly/VdqpZH para obtener más información sobre esto).

WAMS contiene una sucinta aunque completa referencia al script del lado del servidor WAMS (bit.ly/XvsVec). Puede iniciar comandos desde la herramienta de la línea de comandos o desde el portal de Windows Azure en línea. En el símbolo del sistema, simplemente ingrese el comando "azure mobile" para ver una lista de todos los comandos disponibles y “azure mobile list” para enumerar todos sus servicios móviles.

Al igual que el código de su aplicación, las funciones de script del lado del servidor se "registran" en una tabla a través de convenciones de nombres, de manera que los scripts deben coincidir con firmas de método para insertar, leer, actualizar y eliminar operaciones. Estas son las firmas de script de manipulación de datos en JavaScript:

  • Función Insert: insert (item, user, request) { ... }
  • Función Read: read (query, user, request) { ... }
  • Función Update: update (item, user, request) { ... }
  • Función Delete: del (id, user, request) { ... }

Observe que todo lo que necesita se incluye como parámetros de método, es decir, la fila de datos, la identidad del usuario y la solicitud propiamente tal. Esto le permite realizar seguridad en el nivel de fila así como ejecutar cualquier tipo de reglas del lado del servidor como validación de datos cuando estas actividades ocurren.

Como ejemplo, es posible que desee realizar una validación para limitar la longitud de la cadena entrante para las inserciones. Puede hacerlo al usar este código:

function insert(item, user, request) {
  if (item.text.length > 20) {
    request.respond(statusCodes.BAD_REQUEST,
    'The length of the input text must be less than 20');
  } else {
    request.execute();
    }
}

Aunque puede modificar estos scripts en el portal del Windows Azure, también puede hacerlo en su editor de texto favorito y guardar el archivo con una extensión .js, por ejemplo, person.insert.js. Luego puede cargar el script preparado a través de la línea de comandos con un comando con esta sintaxis y firma:

azure mobile script upload <service-name> table/<table-name>.<operation>.js

Un comando para cargar el script de ejemplo anterior se vería como esto (donde "Notable" es el nombre del servicio y "person" es el nombre de la tabla):

azure mobile script upload NotablePeople table/person.insert.js

Como podría esperar, los resultados de un error de validación se pueden atrapar mediante una instrucción de probar/atrapar en cualquier lenguaje del lado del cliente.

Pero bueno, es posible que los desarrolladores de SQL se sientan un poco fuera de toque en este punto, con todas las tendencias de JavaScript del lado del servidor últimamente, pero pueden sentirse más en casa al usar SQL dentro de un objeto script mssql, incluso si está mezclado con JavaScript:

mssql.query('select * from people', {
  success: function(results) {
    console.log(results);
  }
});

Esto es especialmente útil si viene de un desarrollo empresarial repleto de SQL, ya que es mucho más diferente que la naturaleza dinámica de JavaScript.

Para resumir, WAMS es un completo conjunto de servicios de back-end para una compilación de aplicación rápida y entre plataformas. Todos los servicios de Windows Azure, excepto SQL Azure implementan automáticamente URL fáciles de usar con REST y como REST es entre plataformas, no hay necesidad de preocuparse por garantizar que su arquitectura de aplicación sea compatible con nuevos dispositivos de cliente o agentes de usuario en el futuro. Entretanto, trabajar con WAMS no requiere complejas instalaciones de software en el cliente gracias a sus eficaces herramientas de línea de comandos y administración web, así como API fáciles de usar para todo desde almacenamiento básico de datos a envío de correos electrónicos masivos y notificaciones push.

Rachel Appel es evangelizadora de desarrollo en Microsoft en la ciudad de Nueva York. Puede ubicarla en su sitio web en rachelappel.com o por correo electrónico en rachel.appel@microsoft.com. También puede seguir sus últimas actualizaciones en Twitter en twitter.com/rachelappel.

Gracias a los siguientes expertos técnicos por su ayuda en la revisión de este artículo: Paul Batum (Microsoft)
Paul Batum administrador de programas en Microsoft y trabaja en Windows Azure Mobile Services. Su enfoque está en facilitar que los desarrolladores móviles agreguen capacidades de nube a sus aplicaciones. Puede ponerse en contacto con él en pbatum@microsoft.com