Você está na página 1de 24

Captulo

5
Desenvolvimento de Aplicaes para Plataforma Google Android
Fbio de Jesus Lima Gomes, Manoel Taenan Ferreira de Souza, Rafael Madureira Lins de Arajo

Abstract Com a evoluo da tecnologia mvel, os dispositivos mveis tornaram-se uma importante fonte de transmisso e recepo de informaes, gerando a necessidade de sistemas operacionais mais robustos e uma considervel demanda para o desenvolvimento de servios e aplicaes. A plataforma Google Android surgiu para preencher esta lacuna. Dessa forma, este mini-curso pretende disseminar conceitos envolvidos no desenvolvimento de servios e aplicaes para a plataforma Google Android. Tambm ser abordado como aplicaes para dispositivos mveis podem consumir servios web atravs da arquitetura REST. Resumo With the evolution of mobile technology, mobile devices have become an important source of transmission and reception of information, creating the need for more robust operating systems and a considerable demand for the development of services and applications. The Google Android platform was created in order to fill this gap. Thus, this mini-course aims disseminate concepts about developing services and applications for the Google Android platform. Also we will describe how mobile applications can consume web services via REST architecture.

5.1. Introduo
O Google Android OS, tambm chamado apenas de Android, um sistema operacional de cdigo aberto para dispositivos mveis e utiliza uma verso modificada do Sistema Operacional Linux. Permite a desenvolvedores criarem aplicaes Java que controlam o dispositivo atravs de bibliotecas desenvolvidas pela Google. O Android tambm prov uma infra-estrutura robusta de execuo de aplicaes Java. Apesar de ser recente (seu

100

lanamento foi em 2008), o Android foi adotado rapidamente por diversos fabricantes de dispositivos mveis e atualmente a plataforma que mais cresce no mundo. Atualmente, a plataforma Google Android mantida pela OHA (Open Handset Alliance), um grupo formado por mais de 40 empresas que se uniram para inovar e acelerar o desenvolvimento de aplicaes e servios para dispositivos mveis, trazendo aos consumidores uma experincia mais rica em termos de recursos e menos onerosa financeiramente para o mercado. Pode-se dizer que a plataforma Google Android a primeira plataforma completa, aberta e livre para dispositivos mveis. O Android SDK o kit de desenvolvimento que disponibiliza as ferramentas e APIs necessrias para desenvolver aplicaes para a plataforma Google Android, utilizando a linguagem Java. Este mini-curso visa abordar conceitos envolvidos sobre desenvolvimento de aplicaes para a plataforma Google Android, apresentando os principais aspectos do desenvolvimento de aplicaes para dispositivos mveis, com enfoque para o desenvolvimento de aplicaes que consomem servios web utilizando a linguagem Java. Pretende-se capacitar os participantes no desenvolvimento de aplicaes Java para plataforma Google Android com base no Android SDK e demonstrar a arquitetura REST (Representational State Transfer) de desenvolvimento de aplicaes web. O curso procura explorar as funcionalidades dessas tecnologias atravs do desenvolvimento passo a passo de aplicaes-exemplos.

5.2. Arquitetura do Google Android


Android uma pilha de software para dispositivos mveis que inclui sistema operacional, middleware e aplicaes-chave. Esta pilha possui 4 nveis (Google, 2011):

Figura 5.1 Arquitetura da Plataforma Google Android (Google, 2011)

101

1.

LINUX KERNEL: a base da pilha o kernel. O Google usou a verso 2.6 do Linux para construir o kernel do Android, que inclui servios essenciais do sistema, tais como, gerenciamento de memria, gerenciamento de processos, gerenciamento de energia, configuraes de segurana, configuraes de rede e drivers. O kernel tambm atua como uma camada de abstrao entre o hardware do dispositivo e os outros nveis da pilha de software. RUNTIME ANDROID e LIBRARIES: acima do kernel esto as bibliotecas do Android e o android runtime. Android runtime consiste de um conjunto de bibliotecas que fornece a maioria das funcionalidades disponveis nas principais bibliotecas da linguagem de programao Java e de uma Mquina Virtual Dalvik (DVM). Uma aplicao Android roda em seu prprio processo, com a sua prpria instncia da mquina virtual Dalvik. Dessa forma, nenhuma aplicao dependente de outra; se uma aplicao pra, ela no afeta quaisquer outras aplicaes executando no dispositivo e isso simplifica o gerenciamento de memria. Dalvik foi escrito de modo que um dispositivo possa executar vrias VMs eficientemente. Android possui um conjunto de bibliotecas C/C ++ usado por diversos componentes da plataforma. As principais bibliotecas so listadas abaixo: System C library uma implementao da biblioteca padro C (libc), derivada do sistema operacional BSD, alterada para dispositivos embarcados baseados no Linux; Media Libraries baseada no OpenCORE da PacketVideo; estas bibliotecas suportam reproduo e gravao de muitos formatos populares de udio, vdeo e imagem, tais como, MPEG4, H.264, MP3, AAC, AMR, JPG, e PNG. Surface Manager gerencia acesso ao sub-sistema de exibio e compe as camadas grficas 2D e 3D para as aplicaes. LibWebCore um moderno engine para um navegador web que alimenta o navegador do Android. SGL engine de grficos 2D. 3D libraries uma implementao baseada nas APIs OpenGL ES 1.0; estas bibliotecas usam acelerao de hardware 3D (quando disponvel) ou o software embutido no sistema. FreeType renderizador de bitmap e fontes vetorizadas. SQLite engine leve e poderoso de banco de dados relacional para as aplicaes.

2.

3.

APPLICATION FRAMEWORK: O prximo nvel o framework de aplicao que consiste nos programas que gerenciam as funes bsicas do telefone, tais como, alocao de recursos, aplicaes de telefone, mudana entre processos ou programas e informaes sobre a localizao fsica do aparelho. Os desenvolvedores de aplicaes tm acesso total ao framework de aplicao do Android. Isso possibilita tirar vantagem das capacidades de processamento e do suporte de recursos do Android.

102

4.

APPLICATIONS: No topo da pilha esto as aplicaes em si. Aqui se encontram as funes bsicas do dispositivo, como fazer chamadas telefnicas, acessar o navegador web ou acessar sua lista de contatos. Esta a camada do usurio comum, que utiliza a interface de usurio. Apenas os programadores do Google, os desenvolvedores de aplicao e os fabricantes de hardware acessam as camadas inferiores da pilha. O Android contm um conjunto de aplicativos, implementados em Java, como um cliente de e-mail, programa para SMS (Short Message Service), calendrio, mapas, navegador e gerenciador de contatos.

5.3. Componentes de uma aplicao Android


As aplicaes Android podem ser divididas em quatro tipos de componentes bsicos que so definidos pela prpria arquitetura (ABLESON,2007), so eles: 5.3.1. Activities Funcionam como mediadores que definem como as informaes sero apresentadas ao usurio, alm de controlar o fluxo da aplicao. Elas podem interagir com o usurio e trocar informaes com outras activities ou services (MEIER,2009). A maioria do cdigo que escreveremos para uma aplicao Android ir executar no contexto de uma activity. Activities normalmente correspondem a telas: cada activity mostra uma tela para o usurio. Quando esta no est em execuo, o sistema operacional pode elimin-la para liberar memria. 5.3.1.1. Ciclo de vida de uma Activity Ao longo de sua criao at o momento de sua eliminao da memria, uma activity atravessar seis estados, podemos referenciar cada estado pelos mtodos: OnCreate chamado quando a activity criada. Ela obrigatria e chamada apenas uma vez, deve referenciar a tela que ser apresentada ao usurio. OnStart chamado quando a activity est ficando visvel e j tem uma tela definida. OnResume chamado quando a activity foi parada temporariamente e est retornando execuo. OnPause chamado quando a activity est sendo tirada do topo da execuo. Geralmente utilizado para salvar o estado da aplicao. OnStop chamado quando a activity no est mais visvel e est em segundo plano. OnDestroy Executa os ltimos processamentos antes da activity ser literalmente encerrada.

103

Figura 5.2. Ciclo de vida de uma Activity.

5.3.2. Services So programas que executam em segundo plano. No interagem diretamente com o usurio e podem ficar executando por tempo indefinido. 5.3.3. Broadcast e Intent Receivers So componentes que ficam aguardando a ocorrncia de um determinado evento, podese entender como evento a inicializao do sistema operacional, uma chamada de voz, a chegada de um SMS, um evento disparado por uma aplicao (MEIER,2009). Intents so elementos chave no Android, porque facilitam a criao de novas aplicaes a partir de aplicaes j existentes. Precisaremos utilizar Intents para interagir com outras aplicaes e servios que proporcionaro informaes necessrias para nossa aplicao. 5.3.4. Content Providers So os compartilhadores de contedo entre as aplicaes, uma aplicao pode requisitar informaes de outra, por exemplo, uma aplicao pode receber dados da lista de contatos que nativa do Android, e com base nesses dados, realizar algum processamento (LECHETA,2010).

104

5.4. Android SDK e seus pacotes para implementao de aplicaes


O SDK um conjunto de ferramentas utilizadas para desenvolver aplicaes para a plataforma Android. Possui um emulador para simular o dispositivo mvel e uma API completa para a linguagem Java, com todas as classes necessrias para desenvolver as aplicaes (BURNETTE, 2008). Existem atualmente trs verses do SDK para atender a maior parte dos desenvolvedores: verso para Windows, Linux e Mac OS. O ambiente de desenvolvimento que nos utilizaremos nos exemplos seguintes composto, alm do JDK e Android SDK, pelo Eclipse IDE verso Galileo e o Android Development Plugin (ADT), um plugin que ajudar na integrao da IDE com o emulador. Os componentes do ambiente de desenvolvimento podem ser encontrados nos links a seguir: JDK: http://www.oracle.com/technetwork/java/javase/downloads/index.html Android SDK: http://developer.android.com/sdk/ Eclipse IDE: http://www.eclipse.org/downloads/ ADT: http://developer.android.com/sdk/eclipse-adt.html

5.4.1. Conceitos bsicos do Android 5.4.1.1 Criando uma Activity A classe android.app.activity utilizada para criar uma tela na aplicao. Essa tela composta de vrios elementos visuais, os quais no Android so representados pela classe android.view.View (LECHETA, 2010). A classe android.view.View pode representar algo simples como um boto, um checkbox ou imagem, como tambm pode representar algo complexo como um gerenciador de layout, a qual pode conter vrias views aninhadas para organizar na tela.

Figura 5.3. Exemplo de uma Activity.

O mtodo setContentView(view) o que faz a ligao entre a activity e a view e recebe como parmetro a view que ser exibida na tela.

105

5.4.1.2 A classe R A classe R criada automaticamente pelo ADT e no pode ser alterada manualmente. Nela existem constantes para os recursos do projeto. Cada constante nomeada com o nome do recurso, que deve ser escrito com letra minscula e sem espao, e recebe um valor inteiro. 5.4.1.3 O arquivo AndroidManifest.xml Toda aplicao Android deve ter um arquivo AndroidManifest.xml em seu diretrio raiz. Esse arquivo apresenta informaes essenciais sobre a aplicao para o sistema operacional, que deve possuir informaes do sistema antes que possa executar qualquer solicitao do cdigo do aplicativo (MEDNIEKS,2009). Ele armazena informaes como o nome do pacote da aplicao, descreve os componentes da aplicao, determina qual processo da aplicao vai armazenar os componentes, declara de que formas as solicitaes devem ter permisses para acessar partes protegidas da API e interagir com outras aplicaes. Declara tambm as permisses que os outros processos sero obrigados a ter, fim de interagir com os componentes da aplicao, enumera classes e perfis e fornece outras informaes sobre como a aplicao ser executada, declara qual o nvel mnimo da API que o aplicativo exige e enumera bibliotecas que estaro relacionadas com a aplicao.

Figura 5.4. Exemplo de arquivo AndroidManifest.xml

5.4.1.4 Criao de uma interface visual O Android fornece um sofisticado e poderoso modelo, baseado em componentes, para construir sua interface, baseado no esquema de classes fundamentais: android.view.View e android.view.ViewGroup, e inclui tambm as suas classes filhas chamadas de widgets e layouts respectivamente(LECHETA, 2010). Podemos citar alguns exemplos de widgets como Button, TextView, EditText, ListView, CheckBox, RadioButton, Gallery, Spinner, e outros. Podemos citar, tambm, exemplos de layouts como LinearLayout, FrameLayout, RelativeLayout entre outros. Para exemplificar a criao da interface visual criaremos uma tela de login, a qual conter os campos de nome de usurio e senha, e um boto para submet-los.

106

Figura 5.5. Representao grfica da tela de login.

Figura 5.6. Cdigo da tela de login

107

Podemos observar que foram utilizados trs tipos de widgets e um layout. Dois TextView que so utilizados para renderizar strings na tela e dois EditText que so caixas para receber texto. Foi utilizado, tambm, um Button para enviar os dados e um LinearLayout para organiz-los na tela. Podemos observar, tambm, alguns atributos como o id que serve como identificador de cada componente, o text que tem o funcionamento semelhante ao value do HTML e o atributo password que esconde os caracteres digitados no nosso EditText. 5.4.1.5 O mtodo findViewById() Ao construir uma tela usando um arquivo XML de layout, surge a necessidade de recuperar os objetos definidos no arquivo dentro do cdigo-fonte da aplicao para obter seus valores ou definir atributos (LECHETA, 2010). Podemos recuperar um objeto de viso atravs do seu identificador nico (android:id), passando-o como parmetro no mtodo findViewById(id). Esse mtodo recebe o id do componente desejado e retorna uma subclasse de android.view.View, como as classes Button, TextView e EditText. Na figura a seguir mostrado como recuperar a senha inserida pelo usurio atravs do mtodo findViewById(id) e uma pequena ajuda da classe R.

Figura 5.7. Exemplo da utilizao do mtodo findViewById()

5.4.2 Intent Uma intent representa uma inteno da aplicao em realizar alguma ao. Ela envia uma mensagem ao sistema operacional chamada de broadcast. Ao receber essa mensagem, o sistema operacional tomar as decises necessrias (LECHETA, 2010).

108

Uma intent representada pela classe android.content.Intent e pode ser utilizada para enviar uma mensagem ao sistema operacional, abrir uma nova tela da aplicao, utilizando o mtodo startActivity(intent), solicitar ao sistema operacional que ligue para determinado nmero de celular, abrir o browser em um determinado endereo da internet, exibir algum endereo, localizao ou rota no Google Maps dentre outros. 5.4.2.1 Navegao entre telas com passagem de parmetros Existem dois mtodos de se iniciar uma nova tela (activity), atravs dos mtodos startActivity(intent) e startActivityForResult(intent,codigo) que apenas inicia uma nova activity ou inicia uma nova activity e cria um vnculo para ser utilizado ao retornar respectivamente (PEREIRA, 2009). Para que o sistema operacional possa reconhecer nossa nova activity, necessrio adicionar seu endereo no arquivo AndroidManifest.xml.

Figura 5.8. Trecho do arquivo AndroidManifest.xml que contm a nova activity.

Podemos enviar informaes para outras telas atravs de uma intent.

Figura 5.9. Exemplo de passagem de parmetro e troca de tela atravs de uma intent

Podemos observar na figura 5. 8, que criada uma intent com a activity da telaalvo, passado como parmetro atravs do mtodo putExtra() o texto contido no EditText referente ao usurio para a prxima tela, e finalmente, a nova activity iniciada atravs do mtodo startActivity(intent).

109

Figura 5.10. Cdigo da classe SegundaTela.

Observando essa classe, vemos que a intent capturada atravs do mtodo getIntent() e recebemos o parmetro do login atravs do mtodo getStringExtra(string). O contedo da tela apenas um TextView com uma mensagem de boas vindas. 5.4.2.2 Intents Nativas do Android Vimos no exemplo anterior que possvel iniciar uma nova activity atravs das intents. O Android possui alguns tipos de intents pr-definidas que podemos utilizar para enviar mensagens ao SO, porm, algumas delas necessitam de permisses para executar, tais permisses precisam ser registradas no arquivo AndroidManifest.xml (PEREIRA,2009). Vrias intents como a ACTION_VIEW, que serve para iniciar o navegador, a ACTION_CALL, que utilizada para realizar chamadas, a ACTION_PICK, que serve para visualizar todos os contatos, dentre outras, so utilizadas em aplicaes Android. A seguir veremos um exemplo de como chamar o navegador atravs de uma intent pr-definida no Android.

Figura 5.11. Exemplo da iniciao do navegador atravs de uma Intent.

O exemplo demonstra a utilizao da intent ACTION_VIEW, mas, para usar essa intent necessria a permisso INTERNET que deve ter sido registrada previamente.

Figura 5.12. Inserindo a permisso INTERNET no arquivo AndroidManifest.xml

110

5.4.3 Intent Filter Podemos utilizar intents para enviar mensagens ao sistema operacional, definindo uma ao que identifique essa intent. Ento quando a mensagem for enviada ao sistema operacional ela seja identificada por essa ao, e somente uma activity que esteja mapeada para aquela ao ser executada (MEDNIEKS, 2009). Esse tipo de rotina bem prtica quando queremos que mais de um programa esteja configurado para receber uma ao (LECHETA, 2010). Para definir essa ao, basta criar uma Intent usando seu construtor, que recebe uma string que identifica a ao, como, por exemplo:

Figura 5.13. Exemplo de uma chamada de ao por uma Intent.

Logicamente, algum tem que responder por essa ao. Para isto, precisamos mapear um Intent Filter no arquivo AndroidManifest.xml, para escutar esse chamado e delegar a execuo uma activity.

Figura 5.14. Cdigo fonte da classe SegundaTela.

Figura 5.15. Exemplo de mapeamento de uma Intent Filter.

5.4.4 BroadcastReceiver A classe BroadcastReceiver utilizada para responder a determinados eventos enviados por uma intent. Ela sempre executada em segundo plano durante pouco tempo, normalmente dez segundos. No deve ter interface grfica ou interao com o usurio (LECHETA, 2010).

111

utilizada normalmente para executar algum processamento sem que o usurio perceba, em segundo plano. Assim como uma activity, devemos declar-lo no arquivo AndroidManifest.xml atravs da tag <receiver>, deve ser declarada, tambm, um Intent Filter para o broadcast, ou podemos registr-lo dinmicamente, utilizando o mtodo registerReceiver(receiver,filtro), que tem como parmetros uma classe-filha de IntentReceiver e uma instncia da classe IntentFilter que possui a configurao da ao e a categoria (LECHETA, 2010). O mtodo para enviar uma mensagem para um broadcast diferente do utilizado para uma intent que chama uma activity. O mtodo utilizado o sendBroadcast(intent) que envia uma mensagem para todas as aplicaes instaladas no celular. Para implementar um BroadcastReceiver deve-se extender a classe BroadcastReceiver e implementar o mtodo onReceive() que ser executado assim que o IntentFilter receber a mensagem.

Figura 5.16. Utilizando o mtodo sendBroadcast(intent).

112

Figura 5.17. Exemplo de um BroadcastReceiver.

Apenas por motivos didticos foi utilizado a classe Toast para verificar o funcionamento do BroadcastReceiver. Recomenda-se que no tenha nenhum tipo de interao com o usurio.

Figura 5.18. Exemplo do mapeamento de um BroadcastReceiver.

5.4.5 Notification A classe Notification utilizada para exibir informaes ao usurio sem que este seja interrompido se estiver executando alguma atividade. O usurio pode escolher visualizar as informaes neste momento, ou depois (LECHETA, 2010). A notificao exibida na barra de status do celular para chamar a ateno do usurio. Ao ser visualizada, a intent configurada pode uma abrir uma nova activity ou pode ser usada para iniciar um servio por exemplo (MEIER, 2009). Um exemplo de notificao a recepo de uma nova SMS, onde usurio pode decidir visualiz-la ou no. Para criar uma notificao necessrio capturar um servio do Android chamado de NOTIFICATION_SERVICE, ser necessrio, tambm utilizar a classe PendingIntent que criar uma intent que ficar pendente at o usurio decidir visualizar a notificao:

113

Figura 5.19. Exemplo da criao de uma notificao.

Podemos observar, que o construtor da classe Notification recebe trs parmetros: o cone que dever ser exibido, o ttulo da notificao e a hora que aparecer do lado da notificao. Observamos, tambm, que deve-se informar atravs do mtodo setLatestEventInfo, a mensagem que aparecer na barra de status assim que a notificao for reconhecida pelo servio de notificaes do android, o ttulo da notificao e a intent que dever ser chamada quando o usurio visualizar a notificao.

Figura 5.20. Classe que ser instanciada quando a notificao for visualizada.

A figura anterior mostra a classe que ser instanciada quando o usurio visualizar a notificao. Capturamos o servio de notificaes do android, e pedimos

114

para que a notificao no aparea mais na barra de status atravs do mtodo cancel(int) que recebe como parmetro o id da notificao. 5.4.6 Service Tm as mesmas caractersticas dos servios dos sistemas operacionais de computador. So utilizados quando queremos executar algo por tempo indeterminado em segundo plano e que exija um alto consumo de recursos, memria e CPU (LECHETA, 2010). Geralmente so iniciados por um BroadcastReceiver para executar algum processamento demorado, pois um BroadcasReceiver tem um tempo determinado para executar (PEREIRA, 2009). interessante que os servios tenham suas prprias threads para que fiquem independentes do programa hospedeiro. Eles tambm possuem um ciclo de vida prprio, semelhante ao de uma Activity, mas possuem apenas trs estgios: o onCreate, onStart e onDestroy, que desempenham o mesmo papel que o de uma Activity. Para iniciar um servio necessrio criar uma activity que chame o mtodo startService(intent). Para parar um servio existem duas maneiras: a primeira chamar o mtodo stopService(intent), a mesma intent utilizada para iniciar o servio deve ser usada para par-lo, e a segunda forma o prprio servio chamar o mtodo stopSelf().

Figura 5.21. Chamando um servio.

Para implementar um servio necessrio estender a classe android.

115

Figura 5.22. Exemplo de um servio.

Para exemplificar o funcionamento de um servio, utilizamos esta classe, que quando iniciada, cria uma srie de logs. Podemos observar que mesmo fechando a aplicao que iniciou o servio, ele continua criando logs at chamar o mtodo stopSelf(). necessrio mapear o servio no arquivo AndroidManifest.xml e configurar um IntentFilter com a ao que iremos passar como parmetro pela nossa Intent.

116

Figura 5.23. Exemplo do mapeamento de um servio.

5.4.7 AlarmManager So eventos agendados no sistema operacional para serem executados no futuro (LECHETA, 2010). utilizado quando necessrio executar algo uma vez em determinado horrio ou ficar repetindo de tempos em tempos. Quando agendados, ficam ativos no sistema at que sejam explicitamente cancelados, ou o sistema for reiniciado. Para agendar um alarme, primeiro temos que definir uma intent com o BroadcastReceiver que ir responder pelo nosso alarme. Depois temos que capturar o servio do Android responsvel pelo gerenciamento dos alarmes, o AlarmManager.

Figura 5.24. Agendando um alarme.

117

Figura 5.25. BroadcastReceiver que ser chamado pelo nosso alarme.

5.5. Arquitetura REST de desenvolvimento de aplicaes Web Vivemos hoje uma febre de Apps pequenos aplicativos auto-contidos que tem uma nica funo e comumente so interfaces para sistemas Web. A maioria desses aplicativos extremamente dependente de dados para serem teis e esses dados podem vir dos mais variados lugares por exemplo, a plataforma Android disponibiliza ao desenvolvedor uma pequena base dados SQLite onde ele pode criar suas tabelas, armazenar e buscar dados, mas cada vez mais esses dados vm de servios web. A Web uma plataforma orientada a recursos. Um Recurso pode ser definido como qualquer coisa que exposta a Web atravs de um identificador e que possamos manipular (ler e/ou escrever) (WEBBER; PARASTATIDIS, 2010).. Desde sua formalizao REST1 vem sendo um termo e, mais adequadamente, uma arquitetura de software de sistemas Web cada vez mais utilizado, estudado e discutido. Esta arquitetura foi proposta pelo Dr. Roy T. Fielding em 2000 e desde ento vem sendo adotada em vrios sistemas de grande porte como Twitter, Facebook, Flickr e todas as APIs de servios pblicos do Google como Google Agenda, Google Health, Google Data e Google Maps. Veremos a seguir o que REST e, em seguida, formas de se trabalhar com REST em Java. 5.5.1 Definio O protocolo HTTP, e consequentemente servidores HTTP, um protocolo simples e sem muitos recursos. Em sua primeira verso ele apresentou endereamento e statelessness: duas caractersticas de seu projeto que o tornou um avano perante seus rivais e que ainda o mantm escalvel mesmo nos mega-sites de hoje (RICHARDSON; RUBY, 2007). Sistemas com esta arquitetura so sistemas Clientes-Servidores comuns, entretanto suas requisies e respostas so construdas ao redor da transferncia da representao de recursos. Recursos so os blocos fundamentais de sistemas baseados na web, ao ponto que a Web considerada como orientada a recursos (WEBBER; PARASTATIDIS, 2010). A abstrao chave de informao do REST so os recursos. Qualquer informao que pode ser nomeada pode ser um recurso: documentos, imagens, informaes sobre o tempo, uma pessoa, e assim sucessivamente (FIELDING, 2000).
1

Representational State Transfer Transferncia de Estado Representacional

118

Um dos recursos mais comuns da Web so pginas HTML, que em sistemas so comumente a representao de um recurso interno do sistema, por exemplo, uma pgina de exibio de um vdeo do YouTube a representao do recurso vdeo do sistema. Um mesmo recurso pode ter vrias representaes diferentes. Utilizando o exemplo do vdeo do YouTube, uma representao a pgina HTML onde mostrado o vdeo, comentrios, etc. outra representao vista quando o vdeo incorporado em outra pgina. Nessa representao vemos apenas um player que carrega o vdeo em questo. Outra representao, um pouco menos conhecida, a representao em XML2 ou mais recentemente JSON3, ambas tecnologias de transio de dados hierrquicos. Devido a essas caractersticas REST tambm requer que as aplicaes faam total distino entre cliente e servidor atravs da implementao das seguintes caractersticas: 1. Cliente-Servidor: Clientes so separados dos Servidores por uma interface uniforme. Essa diviso faz com que o cliente no se preocupe com, por exemplo, armazenamento de dados ao passo que o servidor no se preocupa com interface com o usurio; 2. Stateless (Sem Estado): A comunicao cliente-servidor ocorre sem que nenhum contexto relativo ao cliente seja armazenado no servidor entre as requisies. Cada requisio de cada cliente contm toda informao necessria para atender aquela requisio e a reposta deve conter toda a informao para satisfazer a requisio; Cache: Como comum na Web, o cliente pode manter um cache das respostas do servidor, portanto recomendado que as respostas contenham informaes sobre se podem e como deve ser feito o cache a fim de evitar que clientes requisitem um mesmo recurso repetidamente. Um bom cache elimina vrias interaes clienteservidor desnecessrias o que proporciona escalabilidade e performance; Camadas: Um cliente no pode normalmente distinguir se ele est ou no conectado ao servidor final ou apenas a um intermedirio. Um sistema com vrios servidores permite o balanceamento de carga, caches compartilhados e ajudam a manter uma boa segurana; Cdigo sob demanda (opcional): Servidores podem ser capazes de estender a funcionalidade de um cliente transferindo lgica para que ele execute. Exemplos disso so componentes compilados como Applets Java ou scripts no lado cliente como JavaScript; Interface uniforme: Todo cliente obedece ao mesmo formato de requisio e recebe o mesmo formato de resposta.

3.

4.

5.

6.

2 3

XML eXtensible Markup Language Linguagem de marcao extensvel. JavaScript Object Notation Notao de Objetos JavaScript.

119

A arquitetura REST est fundamentada sob o protocolo HTTP e seus mtodos. Clientes que acessam recursos informando sua inteno atravs do mtodo que executam sob o recurso. A maioria dos sistemas hoje em dia segue a seguinte conveno de mtodos HTTP, concebidos para simular operaes de CRUD: GET: Leitura; POST: Escrita; PUT: Alterao ou Atualizao; DELETE: Remoo.

Muitas aplicaes novas esto utilizando os princpios REST a fim de obterem um bom nvel de escalabilidade. Normalmente essas aplicaes disponibilizam a seus usurios uma API dos mtodos REST disponveis, suas entradas e suas sadas. Para compreender melhor, vejamos a API de um sistema referncia em tecnologia REST: o Twitter. O Twitter disponibiliza em seu website uma extensa e detalhada documentao da API de seu sistema4. uma plataforma de apoio aos desenvolvedores que desejam criar clientes para o Twitter com pginas de ajuda onde so descritos os mtodos da API, um guia ao desenvolvedor e ferramentas para ajud-lo. Chamadas a alguns mtodos da API podem ser feitas, para testes, atravs de um navegador web qualquer. Durante a escrita deste texto, a API do Twitter aceita a seguinte chamada: http://api.twitter.com/1/users/show.xml?screen_name=fat. Para chamar este mtodo da API basta abrir esta URL em qualquer navegador web. Ao abrir esta URL em um navegador, o que feito uma chamada a API atravs do mtodo HTTP GET. Chamadas a qualquer API REST na Web so compostas de 3 partes: 1. A URL correspondente ao mtodo da API http://api.twitter.com/1/users/show 2. Os parmetros da chamada ao mtodo screen_name = fat 3. O mtodo HTTP utilizado para chamada aquela URL Por padro, toda transao HTTP dos navegadores atuais utiliza o mtodo GET. A URL uma chamada ao mtodo 1/users/show da API do Twitter. Uma particularidade dessa API a possibilidade de escolha do formato de representao do recurso: XML ou JSON, representado pela extenso do arquivo na URL.

Disponvel em http://dev.twitter.com/ - Acesso em 12 outubro 2011

120

5.5.2. REST em Java Em Java chamadas a APIs REST so feitas utilizando chamadas HTTP simples, normalmente com objetos java.net.URL e java.net.HttpURLConnection. Nos exemplos a seguir utilizaremos a API do Twitter como exemplo. A forma mais simples de se executar uma chamada a seguinte: String apiCall = "<url de chamada a API>"; URL url = new URL(apiCall); HttpURLConnection conn; conn = (HttpURLConnection) url.openConnection(); Ao invocar o mtodo openConnection() uma requisio HTTP GET feita a URL especificada em apiCall. Aps essa chamada, importante verificar o cdigo de resposta dado pelo servidor. Normalmente um cdigo de resposta 200 significa que tudo ocorreu como esperado. Outros cdigos de resposta podem ser especificados pela API. if (conn.getResponseCode() == 200) { // Tudo ocorreu como esperado. } Dessa forma podemos tomar alguma providncia caso ocorra algum erro, e garantir um bom funcionamento da aplicao. Aps a confirmao do sucesso da chamada o prximo passo ler os dados da resposta do servidor. necessrio um cuidado especial com o tipo de dado esperado pois a resposta da API pode ser uma imagem, ou um documento, ou at mesmo um Stream de dados. Vamos considerar que a resposta a nossa chamada est em formato textual, caso qual podemos utilizar a seguinte tcnica para captar o resultado num formato mais cmodo para manipulao: BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); StringBuilder str = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { str.append(line); } reader.close(); Aps o recebimento da resposta, uma boa prtica sempre fechar a conexo junto ao servidor invocando o mtodo disconnect(): conn.disconnect(); Dessa forma podemos fazer chamadas a quaisquer API REST utilizando Java.

121

5.5.2.1 Interpretando Respostas Em Java podemos quase sempre considerar um recurso disponibilizado pelo servidor com um Objeto. Comumente recebemos respostas em XML o qual uma serializao de um objeto que est no servidor. Devido a isso um ponto que requer especial ateno a interpretao das respostas. APIs REST utilizam representaes do estado de um recurso (um Objeto) do sistema. Nestes casos a forma mais comum de representao textual, segundo um padro determinado pela API, XML ou JSON. Existem vrias bibliotecas disponveis para se trabalhar com os formatos XML e JSON, algumas bastante sofisticadas e simples de usar. Para XML temos, por exemplo, uma biblioteca chamada jDOM5 que interpreta XML e d ao desenvolvedor uma representao do documento XML na forma de um grafo de objetos com uma interface nativa Java que podem ser facilmente percorridos e manipulados. Para JSON h uma biblioteca chamada Gson6 disponibilizada pelo Google que pode transformar Objetos Java em sua representao JSON e vice-versa: Gson gson = new Gson(); String json = gson.toJson(meuObjeto); MeuObjeto obj = gson.fromJson(json, MeuObjeto.class); Atravs do uso de bibliotecas auxiliares possvel criar objetos concretos Java a partir de representaes textuais dos mesmos. A utilizao de JSON recomendada nestes casos pois grande parte dos sistemas REST atuais so voltados para a interatividade entre sistemas de Websites, os quais so em sua maioria feitos utilizando JavaScript, linguagem-me da notao JSON e que d suporte nativo a interpretao e construo de objetos a partir de sua representao textual e vice-versa.

Referncias bibliogrficas
ABLESON, W. Frank; Unlocking Android - A Developers Guide. Ed. Manning, 2007. BURNETTE, Ed.Hello, Android:Introducing Google`s Mobile Development Plataform. Pragmatic Bookshelf, 2008. Google Android. Disponvel em <http://developer.android.com/guide/basics/what-isandroid.html>. Acesso em 12 outubro 2011. LECHETA, Ricardo R. Google Android. So Paulo: Novatec, 2010, 2 ed. MEDNIEKS, Zigurd; MEIKE, Blake. Desenvolvimento de Aplicaes Android. So Paulo: Novatec, 2009, 1 ed. MEIER, Reto. Professional Android Application Development. Indianapolis: Wiley Publishing, 2009, 1. ed.
5 6

http://www.jdom.org/ - Acesso em 12 outubro 2011 http://code.google.com/p/google-gson/ - Acesso em 12 outubro 2011

122

PEREIRA, Lcio C. Oliva. Android para Desenvolvedores. So Paulo: Brasport, 2009, 1 ed. WEBBER, Jim; PARASTATIDIS, Savas; ROBINSON Ian. REST in Practice: Hypermidia and Systems Architecture. OReilly Media, 2010. RICHARDSON, Leonard; RUBY Sam. RESTful web services. OReilly Media, 2007. FIELDING, Roy; Architectural Styles and the Design of Network-based Software Architectures. Dissertao de Doutorado, University of California, 2000.

123

Você também pode gostar