Conexões HTTP

Com esse Servlet implementado e rodando dentro de um servidor na máquina local, podemos partir para o lado Android da comunicação. Nesse exemplo, estaremos apenas enviando uma requisição a esse Servlet e então exibindo a mensagem recebida ao usuário, utilizando um Toast. Vejamos a Listagem 7, que contém o código responsável por executar essa requisição.

AخA
1
public class HTTPURLCommunication extends Activity {
2
      private static String ENDERECO = "http://10.0.2.2:8080/aula14/ServletHello"; 
3
      @Override
4
      protected void onCreate(Bundle savedInstanceState) { 
5
            super.onCreate(savedInstanceState); 
6
            setContentView(R.layout.main); 
7
            Toast.makeText(this, connect("Aluno"), Toast.LENGTH_LONG); 
8
      } 
9
      public static String connect() { 
10
            HttpURLConnection connection = null; 
11
            BufferedReader rd = null; 
12
            String line = null; 
13
            URL serverAddress = null; 
14
      try { 
15
            serverAddress = new URL(ENDERECO); 
16
            connection = (HttpURLConnection) serverAddress.openConnection(); 
17
            connection.setRequestMethod("GET"); 
18
            connection.connect();
19
            rd = new BufferedReader(new InputStreamReader(connection.getInputStream())); 
20
            line = rd.readLine(); 
21
      } catch (MalformedURLException e) { 
22
            Log.e("ERROR", e.getMessage(), e); 
23
      } catch (IOException e) { 
24
            Log.e("ERROR", e.getMessage(), e); 
25
      } 
26
      return line; 
27
}
28
public static String connect(String id) { 
29
      HttpURLConnection connection = null; 
30
      BufferedReader rd = null; 
31
      String line = null; 
32
      String request = "?id="+id; 
33
      URL serverAddress = null; 
34
      try { 
35
            serverAddress = new URL(ENDERECO+request); 
36
            connection = (HttpURLConnection) serverAddress.openConnection(); 
37
            connection.setRequestMethod("GET"); 
38
            connection.connect();
39
            rd = new BufferedReader(new InputStreamReader( connection.getInputStream()));
40
            line = rd.readLine();
41
      } catch (MalformedURLException e) { 
42
            Log.e("ERROR", e.getMessage(), e); 
43
      } catch (IOException e) { 
44
            Log.e("ERROR", e.getMessage(), e); 
45
      }
46
      return line; 
47
      } 
48
}
Listagem 7 - Código do cliente para excutar uma requisição GET ao ServletHello.

Na Activity apresentada na Listagem 7, implementamos apenas o método onCreate() para inicializar a Activity e fazer a requisição, através do método connect(id), que passa um ID para o servidor que é retornado junto a resposta. Esse parâmetro, em situações reais, é muito importante, pois pode ser através desse ID que a consulta ao banco será feita, ou alguma consulta de outro tipo que necessite de um parâmetro por parte de quem fez a requisição.

O método connect() é o método responsável por fazer a conexão. Como podemos ver, ele utiliza a API HttpUrlConnection para tal. O primeiro passo para fazer a requisição bem sucedida é criar um objeto do tipo URL que conterá o endereço da requisição a ser feita, juntamente do parâmetro da requisição, se for necessário, como mostrado no método connect(id). Uma vez criado o URL, precisamos abrir uma conexão HTTP com o servidor com o qual faremos a comunicação. Para isso, criamos um objeto do tipo HttpUrlConnection e então requisitamos ao objeto URL que abra a conexão com o endereço que foi configurado. Ao abrir essa conexão, o URL retornará um objeto que pode ser transformado em um HttpUrlConnection, através de um cast.

Uma vez que tenhamos o objeto HttpUrlConnection com a conexão aberta, devemos configurar o método de requisição a ser utilizado, através do método setRequestMethod(), e então conectar ao servidor. Para isso, utilizamos o método connect() do objeto HttpUrlConnection.

Após a conexão ser realizada, se esta tiver sucesso, poderemos receber dados através de um objeto BufferedReader. Utilizando o método getInputStream() do HttpUrlConnection, podemos ler uma sequência de dados que será enviada pelo servidor. Essa sequência, quando passada por um InputStreamReader torna-se compreensível e pode ser armazenada em buffer através de um objeto BufferedReader. Perceba que é importante passar por esses dois passos para que tenhamos acesso correto aos dados que estejam sendo enviados pelo servidor.

Uma vez que tenhamos acesso a um objeto do tipo BufferedReader, podemos utilizar o método getLine() para pegar uma linha de conteúdo do que tenha sido enviado, no tipo string. Uma vez que tenhamos esse objeto do tipo string, podemos trabalhar com o que o servidor nos tenha retornado. No caso da Activity apresentada, esse valor é utilizado em um Toast para ser exibido ao usuário.

Perceba que durante o processo de conexão alguns erros podem ocorrer. Esses erros, exceções do tipo IOException ou MalformedURLException, precisam ser tratados utilizando try/catch ou então lançados para cima. Caso sejam lançados, é necessário ter certeza que alguém acima de sua Activity será capaz de tratar esses erros, ou eles poderão gerar o encerramento inesperado de sua aplicação.

Também é importante notar que fazer conexões HTTP leva tempo. Caso conexões sejam feitas como no exemplo exibido, dentro da thread principal, é muito provável que haja uma grande pausa na aplicação, o que pode gerar desconforto para o usuário e, principalmente, uma Activity Not Responding (ANR) que pode levar ao encerramento da aplicação. Para evitar esse tipo de perda de desempenho, o Android disponibiliza ao usuário uma interface para realizar requisições assíncronas. Vejamos agora como essa interface funciona.

play_circle_filled
Vídeo 03 - API Apache HTTP

Versão 5.3 - Todos os Direitos reservados