WebService, Cloud Computing, API, Requisições HTTP. São tantos nomes e siglas que muita gente fica perdido na hora de procurar sobre como fazer uma chamada para um servidor no Android.
Mas a verdade, é que utilizar um WebService para enviar e consumir dados a partir de um aplicativo Android é muito simples.
Então, continue lendo este artigo para aprender e tirar todas as suas dúvidas sobre WebServices e como fazer requisições HTTP no Android:
Como funciona a Internet
Parace uma coisa óbvia, mas muita gente não entende direito como funciona a Internet e a troca de dados que existe para ela funcionar.
As requisições HTTP são uma parte extremamente importante para que a Internet funcione, e nós vamos ver mais sobre elas no próximo tópico, mas antes, vou te dar uma visão geral sobre a Internet.
Toda ves que acessamos a Internet do nosso computador e/ou celular, existe uma troca de dados entre os dispositivos. A ideia é, você solicita um algum dado e recebe uma resposta, e utilizar a informação para alguma coisa.
Sempre que você visita uma página, como o google.com.br, o navegador manda uma requisição HTTP para o endereço digitado, os computadores do Google processam a requisição e mandam uma resposta de volta.
Depois, seu navegador interpreta a resposta e atualiza a tela mostrando a página do Google que você já conhece.
A mesma comunicação e troca acontece quando você solicita dados utilizando um celular, seja o aplicativo de navegação acessando uma página na Internet ou outro aplicativo utilizando uma API.
Os aplicativos podem coletar dados de uma fonte remota na Internet utilizando as requisições HTTP.
Vamos ver mais detalhes sobre as requisições HTTP no próximo tópico.
Entendendo as Requisições HTTP
As requisições HTTP são parte extremamente importante do WebService e servem para incluirmos informações sobre os dados que queremos consultar de um determinado computador na rede/internet.
Na requisição incluimos um localizador de recurso, ou URL, que é o endereço dos dados que queremos.
Por exemplo, se você fizer uma requisição HTTP para a seguinte URL de um computador na Intenet http://pokeapi.co/api/v2/pokemon/1/, ela vai te retornar os dados de um Pokemon.
A URL é uma String que você digita no navegador quando quer visitar uma página na Internet, qualquer que seja ela.
Para entender melhor, vamos analisar a estrutura de uma URL e seus componentes:
http://exemplo.com.br/animal/mamifero/primata?dieta=carnivoro&habitat=america-sul
- http: A primeira parte é o esquema ou protocolo. Geralmente é http ou https.
- exemplo.com.br: Esse é o dominio, é a indentidade do recurso online que você estpa conectando.
- animal/mamifero/primata: Esse é o caminho, que age como uma estrutura de pastas no seu computador ou qualquer outra hierarquia de dados.
- ?dieta=carnivoro&habitat=america-sul: A parte final chama-se query, que começa no “?”. A query é uma forma opicional de incluir filtros de busca.
Então, analisando por completo as requisições HTTP, ela é formada por uma URL, além de outras informações, como a ação que queremos executar e dados do nosso dispositivo.
A requisição é empacotada em um “envelope” e enviada do remetente (seu dispositivo, cliente) até o destinatário (o servidor) pela rede.
Para fazer o envio desse “envelope”, nós precisamos abrir uma conexão de rede entre o remetente e o destinatário utilizando o protocolo HTTP, por exemplo. Assim, podemos trocar mensagens entre os computadores.
Os remetentes, ou clientes, enviam uma requisição para o servidor, quando o servidor recebe a requisição ele envia uma resposta podendo ser uma página HTML, JSON ou XML. Depois de receber a resposta, o cliente processa e exibe os dados.
O HyperText Transfer Protocol (HTTP)
O HTTP é a principal tecnologia por trás da troca de dados através da Internet. HTTP siginifica Protocolo de Transferência de Hipertexto e existe desde o começo da Internet quando os computadores transferiam apenas dados básicos.
O que é um protocolo?
Um protocolo são regras prédefinidas que permitem a interação e comunicação entre computadores para completar uma certa ação ou tarefa. Neste caso, a tarefa é trocar mensagens e dados através da web.
Essa comunicação funciona da seguinte forma, um computador cliente utilizando o HTTP, transmite uma mensagem que contêm métodos HTTP, ou verbos, que expressam intenções ou requisições para um servidor.
Veja alguns dos métodos HTTP ou verbos mais utilizados.
- Get: Significa que eu quero pegar alguns dos dados do servidor.
- Post: Significa que eu quero criar um dado novo no servidor.
- Put: Significa que eu quero atualizar dados existentes no servidor.
- Delete: Significa que eu quero deletar algum dado no servidor.
Essa foi uma visão geral dos verbos HTTP mais populares, mas você pode encontrar mais informações neste link.
O que é JSON e XML?
Como vimos, as requisições HTTP podem utilizar o JSON ou XML para transmitir dados entre o cliente e o servidor. O JSON e o XML são tipos de dados estruturados que representam as informações trocadas entre os dispositivos na rede.
Existe uma grande diferença nesses dois tipos de estruturas de dados, mas antes de analisar qual é melhor ou pior, vamos entender separadamente cada uma.
JSON
O JSON (JavaScript Object Notation) é uma estrutura de dados para armazenamento e transmissão de informações no formato texto. Apesar de muito simples, tem sido bastante utilizado por aplicações Web e Mobile devido a sua capacidade de estruturar informações de uma forma bem compacta e leve, tornando mais rápido a leitura dessas informações.
Isto explica o fato de o JSON ter sido adotado pela maiora das empresas para fazer a troca de milhões de dados pela Internet.
Exemplo de JSON:
{ "Androides": [{ "nome": "Nougat", "versao": 7.0 }, { "nome": "Marshmallow", "versao": 6.0 }, { "nome": "Lollipop", "versao": 5.0 }] }
A ideia utilizada pelo JSON para representar informações é muito simples: para cada valor representado, atribui-se um nome que descreve o seu significado. Esta sintaxe é derivada da forma utilizada pelo JavaScript para representar informações.
XML
XML, do inglês eXtensible Markup Language, é uma linguagem de marcação recomendada pela W3C para a criação de documentos com dados organizados hierarquicamente, tais como textos e banco de dados. A linguagem XML é classificada como extensível porque permite definir os elementos de marcação.
Exemplo de XML:
<?xml version="1.0" encoding="UTF-8"?> <root> <Androides> <element> <nome>Nougat</nome> <versao>7.0</versao> </element> <element> <nome>Marshmallow</nome> <versao>6.0</versao> </element> <element> <nome>Lollipop</nome> <versao>5.0</versao> </element> </Androides> </root>
O XML traz uma sintaxe básica que pode ser utilizada para compartilhar informações entre diferentes computadores e aplicações.
JSON vs XML
Como vimos, tanto o JSON como o XML podem ser usados para receber dados de um servidor web, porém, existe algumas diferenças entre essas duas estruturas de dados.
Não importa se você está carregando um arquivo de configuração, conjunto de dados ou até mesmo alguma informação de um site para usar como fonte de dados no seu aplicativo, há uma diferença de desempenho que você encontrará por causa do tamanho em KBs e o tempo de processamento do JSON ou XML.
Em aplicativos mobile, processar uma estrutura em JSON é muito mais rápido em comparação com estruturas de dados em XML. Escolher qual opção usar requer que você olhe para a solução inteira para a qual você está trabalhando.
Por exemplo, muitas empresas fazem uso das XSLT com seu XML, que pode ser muito poderoso. Se você está desenvolvendo um aplicativo e não precisa de um formato complexo de pesquisa e transformação de dados, então o JSON é a melhor opção.
Requisições HTTP no Android
É extremamente simples fazer requisições HTTP a um WebService em aplicativos Android. Basicamente, você precisa de duas classes da plataforma Android para fazer isso, o HttpUrlConnection e a AsyncTask.
Vamos dividir o exemplo em 3 etapas simples.
Adicionando permissões
Primeiramente você vai precisa adicionar permissões ao seu AndroidManifest para habilitar seu aplicativo o acesso a Internet do dispositivo:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Criando a requisição HTTP
Agora, precisamos construir a chamada para o WebService utilizando o HttpUrlConnection passando a URL e os parâmetros (se houver).
URL url = new URL("http://pokeapi.co/api/v2/pokemon/1/"); HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); urlConnection.setRequestMethod("GET"); urlConnection.connect(); InputStream inputStream = urlConnection.getInputStream(); if (inputStream == null) { return null; } BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); String linha; StringBuffer buffer = new StringBuffer(); while ((linha = reader.readLine()) != null) { buffer.append(linha + "\n"); } if (buffer.length() == 0) { return null; } if (urlConnection != null) { urlConnection.disconnect(); } if (reader != null) { try { reader.close(); } catch (final IOException e) { Log.e("Erro", "Erro fechando o stream", e); } }
Utilizando a AsyncTask
Depois, precisamos preparar o terreno para executar a chamada para o WebService em uma Thread separada da interface do usuário. Isso evita que a tela do usuário fique travada e não responda.
Nunca execute chamadas para um WebService diretamente em uma Activity e/ou Fragment. Por padrão, o Android 3.0 (nível 11 da API) e superior requer que você execute operações de rede em uma Thread que não seja a da interface do usuário. Se você fizer isso, um NetworkOnMainThreadException será lançado.
Então, vamos utilizar uma AsyncTask. Esta classe permite que você execute operações em segundo plano e publique resultados na Thread de interface do usuário sem ter que manipular Threads de forma manual.
A AsyncTask deve ser usada em uma subclasse. A subclasse irá substituir pelo menos um método, o doInBackground, e na maioria das vezes irá substituir um segundo onPostExecute.
public class DownloadDados extends AsyncTask<Void, Void, Void> { @Override protected Void doInBackground(Void... params) { // Esta etapa é usada para executar a tarefa em background ou fazer a chamada para o webservice } @Override protected void onPreExecute () { // Este passo é usado para configurar a tarefa, por exemplo, mostrando uma barra de progresso na interface do usuário. } @Override protected void onProgressUpdate (Progress... values) { // Este método é usado para exibir qualquer forma de progresso na interface do usuário, enquanto a tarefa ainda está em execução. } @Override protected void onPostExecute (Result result) { // O resultado da execução em background é passado para este passo como um parâmetro. } }
Repare que nós temos o seguinte código AsyncTask<Void, Void, Void>, são três tipos genéricos de dados usados por uma AsyncTask:
- Params: O tipo de parâmetros enviados para a AsyncTask após a execução.
- Progress: O tipo das unidades de progresso publicadas durante a execução.
- Result: O tipo de resultado da execução.
Nem todos os tipos sempresão utilizados por uma AsyncTask. Para marcar um tipo como não utilizado, basta usar o tipo Void.
Agora, adicione a chamada do WebService dentro do método doInBackground para ser executado pela AsyncTask.
Veja como fica a implementação completa da AsyncTask incluindo a configuração dos tipos genéricos:
class DownloadDados extends AsyncTask<Void, Void, String> { @Override protected String doInBackground(Void... params) { HttpURLConnection urlConnection = null; BufferedReader reader = null; try { URL url = new URL("http://pokeapi.co/api/v2/pokemon/1/"); urlConnection = (HttpURLConnection) url.openConnection(); urlConnection.setRequestMethod("GET"); urlConnection.connect(); InputStream inputStream = urlConnection.getInputStream(); reader = new BufferedReader(new InputStreamReader(inputStream)); String linha; StringBuffer buffer = new StringBuffer(); while((linha = reader.readLine()) != null) { buffer.append(linha); buffer.append("\n"); } return buffer.toString(); } catch (Exception e) { e.printStackTrace(); if (urlConnection != null) { urlConnection.disconnect(); } if (reader != null) { try { reader.close(); } catch (IOException e1) { e1.printStackTrace(); } } } return null; } @Override protected void onPostExecute(String dados) { // Faça alguma coisa com os dados } }
Uma vez criada, podemos executar assim.
new DownloadDados().execute(url);
A chamada acima pode ser realizada no método onCreate da Activity.
Cloud Computing
O Cloud computing ou computação em nuvem é a entrega da computação como um serviço ao invés de um produto, onde recursos compartilhados, software e informações são fornecidas, permitindo o acesso através de qualquer computador, tablet ou celular conectado à Internet.
Uma de suas vantagens é o melhor aproveitamento dos investimentos em hardware. Como a parte mais pesada do processamento fica na “nuvem”, o usuário precisa apenas de um navegador e uma boa conexão à internet para utilizar o serviço.
Um dos conceitos que encontramos dentro do Cloud Computing voltado para o desenvolvimento mobile é o de Backend as a Service. Esse conceito traz para os desenvolvedores a facilidade de criar serviços de backend completos sem precisar uma linha de programação.
Veja a entrevista que fiz sobre Backend as a Service com o Davi Macedo, CEO do Back4App. Confira aqui!
Esses serviços oferencem desde a criação de WebServices até integração com outros serviços como redes sociais e envio de notificações push.
No artigo Usando Banco de Dados Externo no Android aqui no blog, eu explico um pouco mais sobre APIs e o que esses tipos de serviços podem oferecer.
Gostou do conteúdo sobre WebServices?
Se você quiser aprender ainda mais sobre Desenvolvimento Android, e fazer aplicativos como um dev profissional, dá uma olhada nesse Treinamento Completo que foi preparado para te dar todos os passos que você precisa saber para começar a desenvolver aplicativos de verdade!
Ah, e compartilhe esse artigo com seus amigos, ok?!
Qualquer dúvida deixe nos comentários aqui em baixo.