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

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!
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
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