Requisição HTTP com Java Application Parte 1

Recentemente precisei desenvolver uma aplicação (Java Application) que faz uma requisição http a um servidor externo. E tive muita dificuldade de encontrar bons exemplos sobre o assunto.
Após muita pesquisa e um pouco de estudo pude adquirir algum conhecimento, que será apresentado a seguir neste post.

Inicialmente a API do Java nos disponibiliza algumas classes que nos possibilita criar um servidor e um cliente TCP/IP, abrir uma conexão TCP/IP, ler de uma conexão, escrever para uma conexão. Essas classes são:

  • Socket e ServerSocket
  • InetAddress
  • URL

Todas presente no pacote java.net

Abaixo segue uma exemplo de utilização da classe URL, para se obter o conteúdo de página armazenada em uma servidor web.

A url acessada pela aplicação estava em um servidor local. Mas é possível acessar o conteúdo de qualquer servidor na internet.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
 
public class TesteComunicacao {
 
	/**
	 * 
	 * @param args
	 * @throws MalformedURLException
	 * @throws IOException
	 */
	public static void main(String[] args) 
			throws MalformedURLException, IOException {
 
		try{
 
			// representa um Uniform Resource Locator, 
			// um ponteiro para um "recurso" na World Wide Web.
			URL url = new URL( "http://localhost/index.html" );
 
			System.out.println( "** Tipo de objeto retornado **" );
			System.out.println( url.getContent().getClass().getCanonicalName() );
 
			System.out.println( "\n** alguns métodos da classe URL **" );
			System.out.println( "Número da porta padrão do protocolo:" + url.getDefaultPort() );
			System.out.println( "Nome do arquivo:" + url.getFile() );
			System.out.println( "Nome do host:" + url.getHost() );
			System.out.println( "Parte do caminha:" + url.getPath() );
			System.out.println( "Número da porta:" + url.getPort() );
			System.out.println( "Nome do protocolo:" + url.getProtocol() );
			System.out.println( "Parte da consulta:" + url.getQuery() );
			System.out.println( "Ancora (referencia da URL):" + url.getRef() );
			System.out.println( "userInfo da URL:" + url.getUserInfo() );
			System.out.println( "Número de indexação de um hash table:" + url.hashCode() );
			System.out.println( "Representação da url:" + url.toExternalForm() );
			System.out.println( "Representação da url:" + url.toString() );
 
			// cria um stream de entrada do conteúdo
			InputStreamReader inputReader = new InputStreamReader( url.openStream() );
			BufferedReader bufferedReader = new BufferedReader( inputReader );
 
			System.out.println( "\n** Conteúdo do recurso web **" );
			String linha = "";
			while ( (linha = bufferedReader.readLine()) != null){
				System.out.println(linha);
			}			
 
		} catch (Exception e) {
			System.out.println( e.getMessage() );
		}
	}
}

Resultado:

** Tipo de objeto retornado **
java.util.zip.GZIPInputStream
 
** alguns métodos da classe URL **
Número da porta padrão do protocolo:80
Nome do arquivo:/index.html
Nome do host:localhost
Parte do caminha:/index.html
Número da porta:-1
Nome do protocolo:http
Parte da consulta:null
Ancora (referencia da URL):null
userInfo da URL:null
Número de indexação de um hash table:942787792
Representação da url:http://localhost/index.html
Representação da url:http://localhost/index.html
 
** Conteúdo do recurso web **
<html><body><h1>It works!</h1></body></html>

Até mais :-)

Be Sociable, Share!
  1. Olá amigão, parabéns pelo post! muito bem explicado! Só tenho uma dúvida.. como faço para que ele interprete o código html retornado do servidor? tipo para o código java pegar os dados e mostrar textos, links, todos formatados? Obrigado!

  2. Olá Matheus.
    Vamos lá, a ideia principal de fazer essa requisição é manipular os dados da página, senão poderíamos acessa-lá por um browser.
    Mas respondendo sua pergunta, a forma que você vai utilizar o conteúdo da requisição pode variar. Se você estiver trabalhando com uma aplicação web (tipo JSP), você renderiza o conteúdo na página. Agora se estiver trabalhando com desktop, você terá que usar um controle que renderize o conteudo html como um browser.

    Espero ter respondido sua dúvida.
    Abraços

  3. Rafael William

    Complementando a resposta de Carlos Fernando para Matheus Afonso.

    Existe um componente no java Chamdo JTextPane e também o JEditorPane, ambos conseguem interpretar tagas html.

    mas agora eu gostaria de tirar uma duvida.
    teria como enviar uma requizição a um servidor web utilizando o metodo POST? existe a possibilidade de setar atributos para a requisição para que o servidor web possa tomar decições baseado nestes?

    grato

Deixe um comentario


OBS - Você pode usar estes atributos HTML e tags para formatar seus comentário:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">