Olá pessoal. Me chamo Angelo Valle, sou o autor do antigo site clubekylix.com.br e estou migrando todo o seu conteúdo aqui para o Guia do Hardware.net, devidos aos vários pedidos de reabertura do site – que não será possível devido ao meu escasso tempo.
Este artigo foi escrito para participar de uma promoção em uma outra publicação, porém na época eu solicitei a sua retirada e hoje seus direitos se resumem aqui para o Guia do Hardware.net
Você pode copiar e colar em seu site, desde que contenha meus créditos e um link para cá ok? 🙂
Espero poder ajudar com esse meu artigo, onde abordarei as vantagens da troca de informações entre seu software e seu site.
Bom, chega de papo furado e vamos ao que interessa: Programação 🙂
Atualmente nas grandes cidades existe uma grande concentração de serviços de banda larga e isso tornou nosso trabalho mais interessante, pois podemos utilizar a internet como ferramenta de desenvolvedor.
Tente se lembrar de como era a alguns anos atrás. Quantas vezes eu pensei em fazer um sistema de informação de bugs via web mas acabava não fazendo, pois acesso discado além de ser caro é lento.
No fim, eu optava por deixar um e-mail de contato no form about do projeto…
As possibilidades para esse tipo de código são enormes, vou citar alguns exemplos que estou imaginando agora:
- Envio de erros no sistema para seu database de clientes.
Quando o cliente liga para relatar o erro você já está ciente e tem a resposta, e possivelmente a correção.
- Verificação automática de atualização do software.
Você pode informar ao seu cliente sobre novas versões, e inclusive já dar a opção de download da mesma.
- Cadastros no site.
Fez um software gratuito e espalhou pela web? Coloque um formulário de contato dentro de seu software.
- Seu provedor de hospedagem não deixa você instalar nada no server deles.
Sem problemas, com essa técnica você só precisa de um servidor que interprete ASP, PHP ou qualquer outro script que devolva páginas dinâmicas.
- Administração de vários sites
Você pode desenvolver um sistema de portal de internet e criar a administração apenas via software. Imagine administrar uns 30 sites apenas com alguns cliques e apenas um software rodando localmente?
- Registro on-line
Destrave seu software com uma consulta online em seu database. O pagamento foi feito? use uma conexão segura e libere o software de seu novo cliente em tempo real. Basta ele clicar em um “[ Verificar pagamento ]” por exemplo.
Adapte o código para seu uso e necessidade. Agora vamos entender como tudo funciona:
Criar uma conexão entre dois micros geralmente é uma coisa meio chata de se fazer, pois exige alguns detalhes e certos cuidados que se não observados devidamente, colocam os micros e os dados em perigo.
Mas existe uma forma muito comum de se fazer uma transferência de dados: O “Submit” que é amplamente utilizado nas páginas que encontramos por aí.
Algo simples como:
<form action=’http://dominio.com/pagina.php’ method=’post’>
<input type=’hidden’ name=’nome’ value=’valor’>
<input type=’submit’ value=’Enviar’>
</form>
Pra quem não conhece, esse é um script HTML que envia para o script “pagina.php” a variável “nome” contendo o valor “valor”. O dado só é enviado se o botão “Enviar” for clicado pelo usuário.
O que nosso projeto faz? Ele monta esse formulário e faz o envio para o script, apartir de qualquer evento de seu software.
Agora que já falamos um pouco sobre o funcionamento no software, vamos entender sobre o servidor e o motivo pelo qual indico essa forma:
Na maioria dos casos o desenvolvedor aluga um diretório em um servidor web para colocar o seu site com cadastro de clientes, propaganda, etc.
E se quiser integrar os seus softwares ao site ele pode criar uma conexão direta com o servidor, mas acaba esbarrando em vários problemas:
- A empresa que fornece o hosting não permite (e com razão) que você instale seu programa-servidor no micro deles.
- Caso você consiga de alguma forma instalar algo no server, esbarra com uma porta filtrada pelo firewall.
- Se optar por fazer uma conexão direta ao banco de dados, existe a possibilidade de a empresa responsável não permitir conexões externas, liberando apenas por “localhost”
- Se a empresa permite, você se dá conta de que a senha do seu database está gravada no micro de cada usuário de seu software. Um perigo!
E ainda teríamos muitos outros problemas. Neste caso a melhor opção (e bem mais cara) seria a locação de um servidor dedicado. Mas não vamos gastar dezenas de dólares se podemos fazer isso por apenas alguns reais ao mês.
Então é simples, não vamos “reinventar a roda” e vamos usar o que já temos: o httpd e a porta 80. Resumindo bem, você vai fazer uma espécie de browser dentro do seu sistema, e o servidor vai recebê-lo tão bem como se fosse seu cliente navegando pelo seu site.
Vamos ver a seguir um pequeno exemplo para entender bem o funcionamento.
Eu vou usar como exemplo uma conexão com um script PHP aqui dentro de minha máquina.
Criei um diretório chamado “uploadmaster/site/” na raiz de meu Apache, já preparado para interpretar PHP e dentro deste diretório salvei um arquivo chamado “script.php”. Veja abaixo o conteúdo do mesmo:
<?php
echo “Hello World!”;
?>
O script acima quando executado em um navegador web apenas imprime a frase “Hello World!” na tela.
Não vamos entrar em detalhes quanto ao funcionamento do PHP, nosso foco é com o Delphi/Kylix.
Vejam como ele faz:
Mas e se eu quiser pegar esse “Hello World” e colocar dentro de um showmessage quando meu usuário clicar em “Ler Mensagem”?
Usarei o componente “idHTTP” do Indy. Vejam no meu form como está:
E sendo executado:
Vamos ao código:
No evento “onclick” do botão precisamos definir a url do script no componente idHTTP: Veja abaixo:
procedure TForm1.Button1Click(Sender: TObject);
begin
showmessage(idHTTP1.Get(‘http://192.168.0.2/uploadmaster/site/script.php’));
end;
E o tão esperado resultado:
Perfeito 🙂 Com apenas uma linha já entramos em uma página da web, pegamos o conteúdo da mesma e jogamos dentro de uma caixa de mensagem.
Vamos supor que eu tenha uma distribuidora de alimentos, e que eu queira disponibilizar para meus vendedores uma listagem do estoque da loja em tempo real através do software que eu desenvolvi e que está instalado no laptop de cada um.
Num mundo perfeito eles teriam conexão wireless e acesso à internet em qualquer parte da cidade, de forma que em minha aplicação teria o botão “Verificar estoque” que faria essa consulta em meu banco, facilitanto assim a vida de todos e economizando os recursos financeiros de minha loja, pois não precisaria mais contratar telefonistas e pagar a conta do celular de cada vendedor.
Do lado do servidor eu teria um script que faria essa consulta ao banco e me devolveria esses dados da forma mostrada logo abaixo:
(Como eu já disse acima, não vou entrar em detalhes sobre o PHP e vou escrever apenas o resultado, como se fosse a saída de meu script, ao ser executado)
Arrozn50 KgnFeijãon200 KgnMolho de tomaten500 latas
O “n” é uma quebra de linha, pois vamos fazer um cache em formato texto na aplicação que vai buscar estes dados. Salvem o conteudo acima num arquivo chamado “estoque.php”. Dará o mesmo resultado que daria se fosse uma consulta legítima no servidor de dados.
Vejam pelo meu navegador como respondeu:
E vamos ver no software. Crie um segundo botão e insira o código:
procedure TForm1.Button2Click(Sender: TObject); begin
showmessage(idHTTP1.Get(‘http://192.168.0.2/uploadmaster/site/estoque.php’));
end;
Resultado:
Como a resposta veio correta, vamos tratar a mesma para guarda-la em uma TStringList.
O primeiro passo é trocar todos os “n” por quebras de linha:
Veja o código como ficou:
procedure TForm1.Button2Click(Sender: TObject);
var
estoque: String;
begin
// showmessage(idHTTP1.Get(‘http://192.168.0.2/uploadmaster/site/estoque.php’));
estoque:= idHTTP1.Get(‘http://192.168.0.2/uploadmaster/site/estoque.php’);
estoque:= StringReplace(estoque,’n’,chr(10),[rfReplaceAll]);
showmessage(estoque);
end;
E o resultado:
Explicações básicas:
- var estoque: String
Declarei uma variável “estoque” como variável de texto.
- estoque:= idHTTP1.Get(‘http://192.168.0.2/uploadmaster/site/estoque.php’);
Guardei nessa variável o resultado obtido pela web.
- estoque:= StringReplace(estoque,’n’,chr(10),[rfReplaceAll]);
Quebrei em várias linhas, respeitando a localização do “n”.
Adicione mais um botão e um TStringList ao seu form, veja o meu:
E vamos ao código do terceiro botão. Será por ele que iremos inserir o resultado do script no grid.
Antes, vamos analisar os dados. Temos as informações agrupadas de dois em dois (Arroz, 50 Kg – Feijão, 200 Kg…). Então precisamor preparar esse grid para exibir estes dados.
Como são duas colunas, faça o seguinte no evento onclick do botão3:
procedure TForm1.Button3Click(Sender: TObject);
begin
StringGrid1.FixedRows:= 1;
StringGrid1.FixedCols:= 0;
StringGrid1.ColCount:= 2;
StringGrid1.Cells[0,0]:= ‘Produto’;
StringGrid1.Cells[1,0]:= ‘Quantidade’;
end;
Isso irá fixar o grid com duas colunas e uma linha fixa com os títulos. Para saber a quantidade de linhas que iremos utilizar, devemos criar uma TStringList para jogar o resuldado do script. Veja abaixo o evento de cima modificado e comentado:
procedure TForm1.Button3Click(Sender: TObject);
var
resultado: TStringList; //Cache do resultado
estoque: String; //Resultado
w,x,y,z: integer; //Variaveis para loop e quantidade de linhas
begin
StringGrid1.FixedRows:= 1; //Linha cinza para os títulos
StringGrid1.FixedCols:= 0; //Retira a coluna cinza
StringGrid1.ColCount:= 2; //Trava em duas colunas
StringGrid1.Cells[0,0]:= ‘Produto’; //Título coluna 0
StringGrid1.Cells[1,0]:= ‘Quantidade’; //Título coluna 1resultado:= tstringlist.Create; //Cria o cache
estoque:= idHTTP1.Get(‘http://192.168.0.2/uploadmaster/site/estoque.php’); //Baixa o resultado
estoque:= StringReplace(estoque,’n’,chr(10),[rfReplaceAll]); //Divide em linhas
resultado.Text:= estoque; //Guarda no cachew:= resultado.Count; //Conta as linhas
w:= trunc(w*0.5)+1; //Divide pelo numero de colunas, e soma a linha fixa
StringGrid1.RowCount:= w; //Prepara o grid com as linhas em brancox:= 1; y:= 1; z:= 0; //x: loop, y: numero da linha, z: linha do cache
while (x < w) do //Executa os comandos abaixo até que acabe o cache
begin
StringGrid1.Cells[0,y]:= resultado.Strings[z]; //Adiciona o resultado na coluna 0
z:= z+1; //Avança o cache pra linha seguinte
StringGrid1.Cells[1,y]:= resultado.Strings[z]; //Adiciona o resultado na coluna 1
x:= x+1; y:= y+1; z:= z+1; //Gira o loop
end;
end;
E o resultado sendo executado:
Se optar por usar um componente visualizador de HTML, você pode até construir um browser dessa forma 🙂
Devo alertar para o uso de try quando forem trabalhar na web. O tratamento de possíveis erros é fundamental para um software profissional. Neste caso aqui não usei o mesmo por se tratar de um software educativo e o servidor web ser meu, em minha rede local.
Outro alerta é sobre o quesito segurança. Criem os scripts com login, sessions, cookies, http_referer… Tudo que possa dificultar um acesso que não seja de origem de seu software. o Componente idHTTP é bem completo, veja a documentação dele.
Essa pra mim é a parte mais interessante. Criei um script recebe.php que recebe os dados e salva em um arquivo txt. Veja o código dele abaixo:
<?php
$nomefile= uniqid(“arq”) . “.txt”;
$farquivo=fopen(“txt/” . $nomefile,”w”);
$mensagem=$_GET[“mensagem”];
$mensagem= “Sua mensagem é: ” . $mensagem . “n”;
fwrite($farquivo, $mensagem);
fclose($farquivo);
echo “Arquivo: ” . $nomefile;
?>
Resumindo, ele faz o seguinte:
- Cria um nome aleatório para o arquivo de texto
- Cria o arquivo
- Captura a variável enviada pelo software
- Escreve o texto no arquivo
- Salva o arquivo
- Fecha o arquivo
- Informa o nome do arquivo criado.
No software precisei usar uma função para tratar a variável mensagem, afinal estou enviando via GET e dependendo do texto digitado, poderiam ocorrer alguns erros. Segue a função:
function tratavariavel(entrada: String): String;
var
i: Integer;
begin
Result := ”;
for i := 1 to Length(entrada) do
if ( ((Ord(entrada[i]) >= 48)
and (Ord(entrada[i]) <= 57))
or ((Ord(entrada[i]) >= 65)
and (Ord(entrada[i]) <= 90))
or ((Ord(entrada[i]) >= 97)
and (Ord(entrada[i]) <= 122)) )
then
Result := Result + entrada[i]else
Result := Result + ‘%’ + InttoHex(Ord(entrada[I]), 2);
end;
Esta função não é de minha autoria, eu encontrei na web já tem alguns anos e nem sei quem é o autor. (Avisado :))
Adicione no seu form mais um botão, e um TMemo. Veja abaixo a imagem:
E no evento de click deste botão, veja o código que eu inseri, devidamente comentado:
procedure TForm1.Button4Click(Sender: TObject);
var
urlscript,variaveis,resposta: String; //Declaração das variáveis
begin
urlscript:= ‘http://192.168.0.2/uploadmaster/site/recebe.php?’; //URL que enviarei os dados
variaveis:= ‘mensagem=’ + tratavariavel(memo1.Text); //A variável enviada
resposta:= idHTTP1.Get(urlscript + variaveis); //Capturei a resposta do server
showmessage(resposta); //Exibir a resposta
end;
Bem simples não? Esses componentes do Indy são muito úteis e nos fazem ganhar bastante tempo. Vamos ao teste:
Digitei minha mensagem:
Cliquei em “Enviar mensagem” e o temos nosso resultado:
Vamos confirmar se realmente o arquivo foi criado, e se minha mensagem está lá dentro:
Feito. Agora de posse dessas informações basta um pouco de criatividade para fazer muitas outras coisas. Já podemos ver, editar, deletar, enfim: administrar um banco de dados e sem precisar de nenhuma configuração especial no servidor. Basta suportar linguagens dinânicas e claro, ter um banco de dados disponível.
Não existe fronteira. Pode ser um servidor Windows com IIS ou um FreeBSD com apache. Seu software irá funcionar.
Claro que para aplicações complexas e seguras devemos utilizar o método POST [ idHTTP1.Post(‘url’,tstringlist) ], tratar todos os possíveis erros (timeout, conexão já existente, conexão encerrada, 404, etc) e nos dedicar muito na segurança.
Quando forem desenvolver os scripts, imaginem que o seu software será um “navegador personalizado”, e façam coisas específicas para ele. Uma boa idéia é consultar o HTTP_REFERER e se não for o que você inseriu nas linhas de seu software, recusar a conexão.
Lembrem-se: Você não pode evitar conexões não autorizadas, mas pode dificultar ao máximo. Uma boa senha e um servidor seguro não resolvem nada se o sistema de autenticação é falho.
Software utilizado: Kylix Open Edition versão 2.0 + indy 9.00.03.
(Sim, é a versão gratuita)
ATENÇÃO: Não utilizei nenhuma função específica para o linux, logo o fonte é 100% compatível com o CLX na versão Windows, desde que você tenha o Indy instalado.
Caso tenha dúvidas, escreva para mim pelo email avalle[no-sp@m]guiadohardware.net
Este eu encerro por aqui, espero que seja util e ajude muitas pessoas.
Deixe seu comentário