Requisição HTTP com Java Application Parte 2

Postado por Carlos Fernando Sylverio | Postado em Programação | Postado em 25-09-2009

0

Olá pessoal,

No post anterior Requisição HTTP com Java Application Parte 1 , falei um pouco sobre como obter o conteúdo de uma página web. Mas nem sempre somente o conteúdo de uma página nos interessa.
Na maioria das vezes necessitamos que de uma interação com a página (ou páginas) por meio de troca de informação, ou seja, enviamos dados, a página processa os dados e nos retorna a informação.

Para isso iremos trabalhar com o objeto URLConnection, objeto existente no pacote java.net.
Veja o exemplo abaixo:

package teste.comunication;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
 
public class TesteComunicacao {
 
	public static void main(String[] args) 
			throws MalformedURLException, IOException {
 
		try{
			// monta estrutura de parametros a serem eviados
			String data = URLEncoder.encode( "nome", "UTF-8" ) + "=" + URLEncoder.encode( "Fernando", "UTF-8" );
 
		         URL url = new URL( "http://localhost/get_name.php" );
	                 URLConnection urlConnection = url.openConnection();
 
	                 // envia dados
	                 urlConnection.setDoOutput(true);
	                 OutputStreamWriter outputWriter = new OutputStreamWriter(urlConnection.getOutputStream());
	                 outputWriter.write(data);
	                 outputWriter.flush();
 
	                 // Obtem as respostas
	                 InputStreamReader inputReader = new InputStreamReader(urlConnection.getInputStream());
	                 BufferedReader bufferedReader = new BufferedReader( inputReader );
 
			System.out.println( "\n** retorno da página web **" );
			String linha = "";
			while ( (linha = bufferedReader.readLine()) != null){
				System.out.println(linha);
			}
 
		} catch (Exception e) {
			System.out.println( e.getMessage() );
		}
	}
}

Após instânciar o objeto URL, podemos obter o objeto URLConnection através do seu método openConnection.
O método urlConnection.setDoOutput(true); é executado para informar que será enviado parâmetros.
Depois obtemos o stream de saída e enviamos os dados (obs: esses dados são enviados via método POST).
O retorno é obtido através do método urlConnection.getInputStream que é tratado por meio do objeto InputStreamReader.

Para simular o processamento dos dados enviados gerei um arquivo PHP com o seguinte código:


<?php
$response = $_POST['nome'];

echo "Conteúdo recebido: ";
echo $response;
?>

Ele simplesmente lê o dado recebido e gera uma resposta apartir das informações obtidas.

Enjoy
8-)

Requisição HTTP com Java Application Parte 1

Postado por Carlos Fernando Sylverio | Postado em Programação | Postado em 21-08-2009

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 :-)

Estilo de programação

Postado por Carlos Fernando Sylverio | Postado em Orientação a Objetos, Programação | Postado em 24-06-2009

1

Não é nada de outro mundo, mas totalmente fundamental para o desenvolvimento de software em equipe. Estilo são definições de como escrever o código fonte, em outras palavras, padrões de nomenclatura para nomes e declarações de variáveis, atributos, métodos, classes, etc.

Para isso podemos seguir algumas convenções (como em Java e C#.Net), ou criar um definições de estilo com apropria equipe em questão.

Vantagens ao usar estilo

Quando se esta desenvolvendo em equipe, o código deve ser compreendido por todos os membros. O estilo de programação tem como função auxiliar a equipe escrever código de modo único, assim é de fácil compreenção os códigos criados por outros menbros.

Complementação do estilo

Mais meu habito que propriamente do estilo, é ter um cuidado especial ao se definir nomes de objetos, métodos, atributos, variáveis, entre outros. A correta nomeação dos elementos no código ajuda a diminuir o hiato entre o código e mundo real, e assim como estilo de programação, também tornar mais fácil sua compreensão.

Exemplos do dia a dia

Recentemente estive envolvido em um projeto de uma aplicação antiga. Não havia na empresa mais nenhum desenvolvedor que criou a aplicação e precisávamos implementar algumas melhorias. Ao começar a implementar as melhorias, me deparei com algumas variáveis chamada X, Y, item. E perdi horas tentando compreender o que significa X, Y e item.

Conclusão

Para exemplificar esses conceitos, criei 2 aplicações iguais, ambas em Java, porem o primeiro está totalmento sem estilo e o segundo com um estilo que normalmente sigo. Compare e tire suas próprias conclusões:

Aplicação sem estilo

public class XyZ {
	public String no;
	public int id;
}
import java.util.ArrayList;
 
public class XyZs extends ArrayList{
	private static final long serialVersionUID = 1L;
}
import java.util.Iterator;
 
public class Application {
 
	public static void main(String[] args) {
 
		XyZs xxs = new XyZs();
 
		xxs.add(Cria("Sergio", 20));
		xxs.add(Cria("Rafael", 24));
		xxs.add(Cria("Frank", 22));
 
		ImprimeLista(xxs);
	}
 
	public static XyZ Cria(String n, int i) {
 
		XyZ x = new XyZ();
		x.no = n;
		x.id = i;
 
		return x;
	}
 
	public static void ImprimeLista(XyZs g){
		System.out.print("==== Lista de Amigos ==== \n");
 
		for (Iterator i = g.iterator(); i.hasNext();) {
			XyZ a = (XyZ) i.next();
			System.out.print("Nome: " + a.no + " idade: " + a.id + "\n");
		}
	}
 
}

Aplicação com estilo

public class Amigo {
	public String nome;
	public int idade;
}
import java.util.ArrayList;
 
public class Amigos extends ArrayList{
	private static final long serialVersionUID = 1L;
}
import java.util.Iterator;
 
public class Application {
 
	public static void main(String[] args) {
 
		// cria lista de amigos
		Amigos amigos = new Amigos();
 
		// adiciona amigo a lista
		amigos.add(CriaAmigo("Sergio", 20));
		amigos.add(CriaAmigo("Rafael", 24));
		amigos.add(CriaAmigo("Frank", 22));
 
		ImprimeLista(amigos);
	}
 
	public static Amigo CriaAmigo(String nome, int idade) {
 
		Amigo ret = new Amigo();
		ret.nome = nome;
		ret.idade = idade;
 
		return ret;
	}
 
	public static void ImprimeLista(Amigos amigos){
		System.out.print("==== Lista de Amigos ==== \n");
 
		for (Iterator i = amigos.iterator(); i.hasNext();) {
			Amigo amigo = (Amigo) i.next();
			System.out.print("Nome: " + amigo.nome + " idade: " + amigo.idade + "\n");
		}
	}
 
}

Perceptível a diferença, não?

Links Complementares:

Não encontri nenhum artigo de estilo de Java, assim que eu encontrar eu posto aqui. Enquanto isso podemos ver a API do Java e tirar nossas conclusões de como escrever em Java com um estilo bem parecido.

Até mais… ;-)