.style0 { vertical-align:bottom; } .style1 { vertical-align:bottom; } .style2 { vertical-align:top; } .style3 { vertical-align:top; } .style4 { vertical-align:top; } .style5 { vertical-align:top; } .style6 { vertical-align:top; } .style7 { vertical-align:top; } .style8 { vertical-align:top; } .style9 { vertical-align:top; } .style10 { vertical-align:top; } .style11 { vertical-align:top; }

Aplicativos modernos

Ative seus aplicativos modernos com os serviços móveis do Windows Azure

Rachel Appel

 

Rachel AppelIndependentemente da plataforma visada para publicação de aplicativos, os serviços móveis do Windows Azure (WAMS) são um back-end para governá-los. É um componente-chave da plataforma Windows Azure e é o back-end para desenvolvimento da Web e de aplicativos modernos em várias plataformas. Neste artigo abordarei a configuração do WAMS para funcionar no Visual Studio, fornecerei uma visão geral da API do WAMS e explicarei a codificação necessária para criar um aplicativo moderno com o WAMS.  

A arquitetura para várias plataformas do WAMS

Há vários serviços do Windows Azure que podem ser usados para gerenciar dados e ativar o back-end de um aplicativo. Não é incomum que os aplicativos consumam mais de um serviço do Windows Azure. Aqui estão alguns dos serviços disponíveis:

  • WAMS: Um conjunto completo e para várias plataformas de serviços e recursos de back-end direcionado especificamente para a criação rápida de aplicativos.
  • SQL Azure: Esse é o mesmo famoso SQL Server, mas na nuvem, com uma interface de administração da Web fácil de usar. É econômico para startups, empresas e ISVs menores.
  • Armazenamento de tabela do Windows Azure: Uma maneira NoSQL de trabalhar com dados tabulares e algumas vezes não tão tabulares.
  • Armazenamento de BLOB (objeto binário grande) do Windows Azure: Uma maneira altamente escalonável de conter dados em pares chave/valor na nuvem sem as preocupações e restrições de dados estruturados.
  • Sites do Windows Azure: Além da hospedagem de sites, os sites do Windows Azure podem executar o ASP.NET e as APIs da Web do ASP.NET. É uma excelente maneira de ativar sites, programas e aplicativos herdados por HTTP sem ter de fazer muito retrabalho de arquitetura.

A arquitetura de uma aplicativo dependerá de seus requisitos. Se o aplicativo precisar armazenar grandes volumes (por exemplo, dezenas ou centenas de gigabytes de dados) de mídia ou conteúdo binário, usar o armazenamento BLOB do Windows Azure será provavelmente mais adequado. Para a maioria dos aplicativos que apenas leem ou gravam dados de texto acompanhados de algumas imagens, o WAMS é uma solução simples e fácil. Muitos aplicativos precisam manipular dados herdados, portanto, migrar do SQL Server, SQL Server Compact (SQL CE) ou qualquer das famílias de bancos de dados Microsoft SQL diretamente para o SQL Azure pode ser o melhor caminho se você precisar de um DBA para administrar os dados.

Para a maioria dos aplicativos, o WAMS é bastante adequado, pois, não apenas ele tem armazenamento de dados, mas também um conjunto completo de serviços de back-end além do banco de dados criado com a finalidade expressa de suportar cenários comuns de infraestrutura de aplicativos como notificações por push e autenticação.

Serviços principais do WAMS

Os recursos a seguir são os principais serviços do WAMS:

  • Dados: Certamente, hospedar e manipular dados é essencial para todos os aplicativos; portanto, o WAMS dá suporte a isso. Para cada serviço móvel, há um banco de dados do SQL Azure por detrás.
  • Serviços de mensagens: As notificações por push são cada vez mais importantes porque os usuários desejam permanecer atualizados. À medida que os aplicativos ficam cada vez mais complexos, intuitivos e amigáveis, em outras palavras, mais modernos, os recursos como os serviços de mensagens por push e comunicação em tempo real se tornam lugar comum. Felizmente, usar notificações por push no WAMS é tão fácil como uma chamada para enviar uma notificação do sistema (uma pequena mensagem pop-up no canto superior ou inferior direito do SO) como a seguir:

 

push.wns.sendToastText04(channel, { text1: item.text });

  • Autenticação: Proteger os dados, especialmente dados do usuário, é tão importante como os próprios dados. O fundamento dos aplicativos modernos e autenticar via sites amplamente populares, como o Facebook ou Twitter; portanto, o WAMS permite que você autentique com qualquer um dos seguintes provedores de identidade:
  1. Conta da Microsoft (o provedor de autenticação anteriormente conhecido como Windows Live ID)
  2. Logon no Facebook
  3. Logon no Twitter
  4. Logon no Google

O WAMS dá suporta a várias bibliotecas para o desenvolvimento da família de aplicativos Windows,incluindo a biblioteca do Tempo de Execução do Windows (WinRT) para clientes gerenciados, a biblioteca cliente Windows Library for JavaScript (WinJS) e APIs do Representational State Transfer (REST) para tudo: serviços principais, autenticação e serviço de mensagens. Há até bibliotecas cliente iOS e Android para paridade entre plataformas.

Usar a API do WAMS na Windows Store ou projetos do Windows Phone

Esteja você criando um aplicativo da Windows Store ou do Windows Phone, o código será quase idêntico e o código JavaScript é incrivelmente semelhante no lado do WinJS. Uma vez que você tenha as ferramentas de desenvolvimento adequadas e o WAMS instalado e configurado (consulte bit.ly/NAAQz8 para saber mais sobre isso), escrever o código para acessar objetos e dados em um serviço móvel é fácil, mas diferente do desenvolvimento de aplicativo tradicional cliente/servidor ou de n camadas. Isso é porque o WAMS se integra ao aplicativo de tal modo que certas alterações no modelo do aplicativo podem causar alterações nas estruturas de dados subjacentes. Em outras palavras, você pode descartar muitas das instruções de definição de dados SQL tradicionais e simplesmente modificar o membro de uma classe, recompilar, executar o aplicativo e verificar as alterações no nível do banco de dados. Além disso, o JavaScript substitui o SQL como a sintaxe atual para manutenção do banco de dados como scripts de validação ou criação de restrições nos dados. Ser capaz de facilmente criar scripts para alterações de banco de dados a partir do aplicativo, de prompt de comando e da ferramenta de administração da Web encurta o processo de criação do aplicativo.

O namespace Microsoft.WindowsAzure.MobileServices fornece acesso padrão a objetos no serviço móvel ou seu banco de dados SQL Azure subjacente. O exemplo de código a seguir cria uma instância 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 pode ser visto, a URL e a chave de seu aplicativo WAMS são parâmetros do construtor MobileServiceClient. Para descobrir sua URL e chave, faça logon no portal do Windows Azure e navegue até o serviço móvel. Em seguida, clique no ícone de nuvem à esquerda do item de menu do dashboard.

No exemplo de código anterior, a classe MobileServiceClient comporta-se como um objeto de conexão, mas sem aqueles desagradáveis métodos open e close da época do objeto SqlConnection. A classe MobileServiceClient gerencia a conectividade para você. Se seus dados estiverem definidos para consumo público não será preciso chamar o método MobileServiceClient.login. Ainda assim poderá acessar tabelas, executar consultas e classificar dados. Certamente, operações mais complexas ou que se preocupam com segurança podem exigir credenciais.

Uma vez que você tenha uma instância válida de uma classe MobileServiceClient, é possível usar GetTable<T> para interagir com uma tabela WAMS subjacente:

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

O parâmetro tipo T em IMobileServiceTable<T> faz com que o compilador inspecione as propriedades e as informações sobre o parâmetro, nesse caso a classe Person na Figura 1,mapeando-o na tabela subjacente no nível do banco de dados. Isso lhe permite adicionar ou modificar propriedades durante o desenvolvimento e ver as alterações de esquema refletidas na nuvem em tempo de execução, resultando em uma aliança mais simbiótica entre o código e o banco de dados. No entanto, alterações de esquema no nível do banco de dados não acontecem automaticamente para cada alteração no código. Por exemplo, adicionar uma propriedade ao código na Figura 1 cria uma nova coluna na tabela, mas excluir uma propriedade existente não causa uma exclusão.

Figura 1 A classe 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> retorna um objeto IMobileServiceTable que representa a tabela subjacente real no WAMS e contém métodos para inserção, atualização, exclusão e classificação de serviços, como mostrado aqui:

// 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));

Você pode criar sua camada de dados no código criando uma classe personalizada que corresponda os nomes da tabela e dos membros. Essa técnica é conhecida como convenção em detrimento da configuração, que é uma maneira de reduzir o código de configuração XML inflado em favor de continuidade e consistência na nomenclatura, resultando em menos código com uma maior capacidade de manutenção. Por exemplo, a classe e o esquema na Figura 1 demonstram que o código da classe cliente é mapeado para uma tabela WAMS e seus membros.

O código na Figura 1 cria o esquema do banco de dados mostrado na Figura 2.

Figura 2 A convenção em detrimento da configuração corresponde nomes do código de classe e do esquema do banco de dados

Coluna Tipo
Id SQL Bigint
Name String
Date DateTime
Picture String
Notes String

O WAMS infere tipos de dados a partir do tipo de dados da propriedade no código. Alguns tipos, no entanto, não podem ser representados com atributos de dados, especificamente dados binários e imagem. Isso significa que quando desejar armazenar uma imagem, você deve usar o armazenamento de BLOB do Windows Azure porque é mais escalonável, barato e tem um desempenho muito melhor que a alternativa, que é a codificação Base64 em uma cadeia de caracteres e, em seguida, armazenando-a em uma tabela WAMS. O armazenamento de BLOB do Windows Azure tem uma API REST e uma API gerenciada para que os desenvolvedores possam acessar facilmente o serviço por plataformas e preferências.

Para executar operações de inserção, atualização e exclusão, simplesmente crie uma instância de seu objeto personalizado e chame o método correspondente a partir de seu 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 a chamada de InsertAsync é claramente assíncrona, a chamada não impede que o código da interface do usuário seja executado e você pode gerenciar os dados em segundo plano sem interferir com as atividades do usuário. Os aplicativos da Windows Store e do Windows Phone funcionam de maneira assíncrona por padrão, pois você não pode contar sempre com conectividade confiável.

Se estiver trabalhando com XAML, você pode associar dados da tabela chamando o método ToListAsync do objeto IMobileServiceTable. Esse método prepara os dados e os retorna em um objeto que associa tabelas WAMS facilmente a elementos ListView de XAML, como o exemplo de código a seguir demonstra:

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

O código anterior é similar ao código de associação de dados tradicional do Microsoft .NET Framework. Você também pode chamar métodos no objeto IMobileServiceTable para retornar um IList<T> ou IEnumerable<T> se desejar executar manualmente um loop pelos dados, em vez de associar dados.

Gerenciando recursos avançados do WAMS

Você precisará, certamente, administrar e manter o serviço móvel, seus dados, a segurança e todas as tarefas normais que acompanham a manutenção de back-end, como nem todo esse tipo de trabalho deve ser feito no aplicativo. Felizmente, o WAMS lhe dá algumas opções com relação às tarefas administrativas de back-end:

  • Ferramenta de linha de comando: Isso é excelente não importa qual plataforma use para desenvolvimento; é possível usar qualquer prompt de comando depois de baixar e instalar as bibliotecas de linha de comando (consulte bit.ly/14Q49bi para saber mais sobre isso).    
  • Administração da Web: Excelente para desenvolvimento back-end em várias plataformas, e também conhecido como o portal do Windows Azure, essa ferramenta lhe permite fazer todo o básico online: criar banco de dados, executar scripts do lado do servidor, gerenciar serviços, gerenciar segurança e outras coisas (o portal é acessado a partir do site principal do Windows Azure em bit.ly/4yqVhP).
  • SQL Server Management Studio: Uma clássica ferramenta de administração de banco de dados da Microsoft que você pode usar para conectar e gerenciar os bancos de dados por trás do serviço móvel (consulte bit.ly/VdqpZH para saber mais sobre isso).

O WAMS contém uma referência de script do lado do servidor do WAMS sucinta, porém completa (bit.ly/XvsVec). Você pode iniciar comandos da ferramenta de linha de comando ou do portal do Windows Azure online. No prompt de comando, insira o comando “azure mobile” para ver uma lista de todos os comandos disponíveis e “azure mobile list” para listar todos os seus serviços móveis.

Como seu código do aplicativo,as funções de script do lado do servidor são “registradas” em uma tabela por convenções de nomenclatura, assim os scripts devem corresponder assinaturas de métodos para as operações de inserção, leitura, atualização e exclusão. Aqui estão as assinaturas de script de manipulação de dados em JavaScript:

  • Função Insert: insert (item, usuário, solicitação) { ... }
  • Função Read: read (consulta, usuário, solicitação) { ... }
  • Função Update: update (item, usuário, solicitação) { ... }
  • Função Delete: del (id, usuário, solicitação) { ... }

Observe que tudo de que você precisa está incluído como parâmetros de método, isso é, a linha de dados, a identidade do usuário e a própria solicitação. Isso permite que você execute a segurança em nível de linha assim como executar qualquer tipo de regra do lado do servidor, como validação de dados, quando essas atividades ocorrerem.

Como exemplo, talvez você queira executar a validação para limitar o comprimento das cadeias de caracteres de entrada nas inserções. Isso pode ser feito usando o 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(); } }

Embora você possa modificar esses scripts no portal do Windows Azure, também é possível fazê-lo em seu editor de texto favorito e salvar o arquivo com uma extensão .js, por exemplo, person.insert.js. Em seguida, você pode carregar o script preparado via a linha de comando com um comando com esta sintaxe e assinatura:

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

Um comando para carregar o script de exemplo anterior seria algo semelhante a isto (em que “Notable” é o nome do serviço e “person” é o nome da tabela):

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

Como você pode esperar, os resultados de um erro de validação podem ser capturados por uma instrução try/catch em qualquer linguagem no lado do cliente.

Infelizmente, os desenvolvedores de SQL devem estar se sentindo perdidos nessa hora, com todas as recentes tendências do JavaScript do lado do servidor, mas eles podem se sentir mais confortáveis usando SQL dentro de um objeto de script mssql, mesmo que esteja misturado com JavaScript:

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

Isso é especialmente útil se você vem de um histórico de desenvolvimento empresarial cheio de SQL, pois é muito diferente da natureza dinâmica do JavaScript.

Revisando, o WAMS é um conjunto completo de serviços back-end para criação rápida de aplicativos em várias plataformas. Todos os serviços do Windows Azure, exceto o SQL Azure, implementam automaticamente URLs amigáveis REST, e como o REST é multiplataforma, não há necessidade de se preocupar em garantir que a arquitetura de seu aplicativo irá dar suporte a novos dispositivos cliente ou agentes de usuário no futuro. Enquanto isso, trabalhar com o WAMS não requer instalações pesadas de software no cliente por causa de sua administração da Web e ferramentas de linha de comando poderosas, além de APIs fáceis de usar para tudo, desde armazenamento de dados básico a envio de emails em massa e notificações por push.

Rachel Appel é desenvolvedora e divulgadora da Microsoft na cidade de Nova York. Entre em contato com ela por meio do site rachelappel.com ou pelo email rachel.appel@microsoft.com. Você também pode segui-la no Twitter em twitter.com/rachelappel.

Agradecemos ao seguinte especialista técnico pela revisão deste artigo: Paul Batum (Microsoft)
Paul Batum é um gerente de programa da Microsoft e trabalha nos serviços móveis do Windows Azure. Seu foco está em facilitar aos desenvolvedores móveis a adição de recursos de nuvem em seus aplicativos. Entre em contato com ele pelo email pbatum@microsoft.com