Uma das funções mais interessantes hoje em qualquer tipo de cadastro que contenha endereço postal é a busca pelo CEP, para obter o endereço, bairro, cidade e estado; muitos desenvolvedores mantém uma base de dados do CEP local (em cada cliente) para que possa ser usada pela aplicação durante a edição dos endereços no cadastro.

O “buscarcep.com.br” é um WebService de consulta de CEP gratuíto e foi usado nesse exemplo. Esse serviço pode facilitar a vida de muita gente, já que usando o serviço, não mais será necessário manter uma base de dados do CEP local (em cada cliente).

Abaixo dou um exemplo de como implementar isso em uma aplicação WEB usando Delphi Webbroker e Javascript (para dar um toque Web 2.0 na aplicação).

Parte 01: codigo Webbroker para o seu servidor WEB

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
unit buscacep;
 
interface
 
uses
  Windows, Messages, SysUtils, Classes, HTTPApp, HTTPProd, WinInet;
type
  TWebModule1 = class(TWebModule)
    procedure WebModule1wwwbuscarcepAction(Sender: TObject;
      Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
    function GetInetFile (const fileURL, FileName: String): boolean;
    procedure WebModuleCreate(Sender: TObject);
  private
    { Private declarations }
    scriptname: string;
  public
    { Public declarations }
  end;
 
var
  WebModule1: TWebModule1;
 
implementation
 
{$R *.DFM}
 
procedure TWebModule1.WebModule1wwwbuscarcepAction(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
  internetFile,  localFileName: string;
  StreamArq: TMemoryStream;
begin
 // define URL da busca
 internetFile := 'http://www.buscarcep.com.br/?cep='+
 request.queryfields.values['CEP']+'&formato=xml';
 // define nome arquivo e local onde será armazenado o XML resultado.
 localFileName := '/inetpub/wwwroot/buscacep/bcep.xml';
 
 // chama o servico
 if GetInetFile(internetFile, localFileName) then
    begin
     StreamArq := TMemoryStream.Create;
     Try
        // carrega o conteudo do arquivo e devolve para o cliente
        StreamArq.LoadFromFile(localFileName);
        StreamArq.Position := 0;
        response.contenttype := 'text/xml';
        Response.ContentStream := StreamArq;
        Response.SendResponse;
 
     Finally
        DeleteFile(localFileName);
        StreamArq.Free;
     end;
 
    end
 else
    // aqui pode ser realizado um tratamento melhor em XML.
    response.Content := 'Error ao ler webService do CEP.';
 
end;
 
// Função que usa a WinInet para conectar com o servico e obter o arquivo
function TWebModule1.GetInetFile (const fileURL, FileName: String): boolean;
const
  BufferSize = 1024;
var
  hSession, hURL: HInternet;
  Buffer: array[1..BufferSize] of Byte;
  BufferLen: DWORD;
  f: File;
  sAppName: string;
begin
 sAppName := ExtractFileName(scriptname) ;
 
 hSession := InternetOpen(PChar(sAppName), INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0) ;
 try
  hURL := InternetOpenURL(hSession, PChar(fileURL), nil, 0, 0, 0) ;
   try
   AssignFile(f, FileName) ;
   Rewrite(f,1) ;
   repeat
    InternetReadFile(hURL, @Buffer, SizeOf(Buffer), BufferLen) ;
    BlockWrite(f, Buffer, BufferLen)
   until BufferLen = 0;
   CloseFile(f) ;
 
   result := True;
   finally
   InternetCloseHandle(hURL)
   end
 
 finally
  InternetCloseHandle(hSession)
 end
end;
 
procedure TWebModule1.WebModuleCreate(Sender: TObject);
var
  FN: array[0..MAX_PATH- 1] of char;
begin
  SetString(ScriptName, FN, GetModuleFileName(hInstance, FN, SizeOf(FN)));
  ScriptName := '/'+LowerCase(ExtractFileName(ScriptName));
 
end;
 
end.

Parte 02: código javascript puro, para ser usado na página que fará a chamada ao serviço.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
var xmlhttp;
 
function buscarcep(obj) { 
 
   if (window.XMLHttpRequest) { 
      xmlhttp = new XMLHttpRequest(); 
   } else if (window.ActiveXObject) { 
      xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); 
   } else { 
       alert("Seu navegador deve ser atualizado!."); 
      return; 
   } 
 
 
    if (obj.CEP.value.length < 8) {
    document.getElementById ("jspanCEP").innerHTML = 
    '=> O numero do CEP deve conter 08 digitos';
    }
    else {
 
    document.getElementById ("jspanCEP").innerHTML = 
    'buscando dados CEP no WebService ....';
 
    xmlhttp.open("GET", '/pCEP.exe/wwwbuscarcep?CEP='+
    obj.CEP.value+'&formato=xml', true); 
    xmlhttp.onreadystatechange = processReqChangeCEP; 
    xmlhttp.send(null); 
    }
} 
 
function processReqChangeCEP() { 
    if (xmlhttp.readyState == 4) {
       if (xmlhttp.status == 200) { 
       processXMLlocCEP(xmlhttp.responseXML)
		}
      }  
    else return false;
} 
 
function processXMLlocCEP(obj) {
var dataArray = obj.getElementsByTagName('webservicecep');
var insertData = '<hr size="1"><b>Resultado Consulta WebService CEP:</b><br> ';
 
	  try {
 
	   switch (dataArray[0].getElementsByTagName('resultado')[0].firstChild.nodeValue * 1) {
	   	case 1:	insertData += 'CEP: ' + 
		    dataArray[0].getElementsByTagName('cep')[0].firstChild.nodeValue +
	   		'<br>UF: ' +
	   		dataArray[0].getElementsByTagName('uf')[0].firstChild.nodeValue +
	   		'<br>Cidade: ' +
	   		dataArray[0].getElementsByTagName('cidade')[0].firstChild.nodeValue +
	   		'<br>Bairro: ' +
	   		dataArray[0].getElementsByTagName('bairro')[0].firstChild.nodeValue +
	   		'<br>Logradouro: ' +
	   		dataArray[0].getElementsByTagName('tipo_logradouro')[0].firstChild.nodeValue +
	   		' ' +
	   		dataArray[0].getElementsByTagName('logradouro')[0].firstChild.nodeValue; break;
		case -1: insertData += 'CEP n&atilde;o encontrado!';  break;
		case -2: insertData += 'Formato CEP inv&aacute;lido!';  break;
		case -3: insertData += 'Limite de buscas por IP excedido.';  break;
		case -4: insertData += 'IP banido. Favor, contate o supervisor!';  break;
		default: 'Não foi possível conectar ao serviço.';
	   }
      }
	  catch(Error) {
	  	insertData += 'Consulta n&atilde;o retornou resultado'
	  }
 
      document.getElementById ('jspanCEP').innerHTML = insertData;
}

Parte 03: código HTML exemplo para ser colocado no seu servidor WEB para testar o programa.

<html>
<head>
<script language="javascript" src="buscarcep.js"></script>
</head> 
<body>
<h1>Busca CEP</h1>(WebService = www.buscarcep.com.br) 
<form method="GET"
        action="/pcep.exe/buscacep" name="frmCEP">
          <p><input type="text" name="CEP" size="10" maxlength="8" class="formtext"><input
          type="button" value="Busca CEP na Internet" name="B2" class="bmtext" 
		  onClick="javascript:buscarcep(frmCEP)"></p>
        </form>
       <span id="jspanCEP"></span>
</body>
</html>

Obs.: Para testar, compile o código 01 usando o Delphi 7 (por exemplo, deve funcionar no 5,6,BDS,…) e copie o programa para uma pasta do seu servidor WEB, salve o código 02 (javascript) como “buscarcep.js” na mesma pasta do código 03 (html exemplo); digite o URL para chamar o “html exemplo”.

Nota. Alguns devem estar se perguntando, mas se é apenas para consultar o CEP num serviço pronto, pra que implementar a chamado no Webbroker?, porque não fazer a chamada do serviço diretamente do código JavaScript. A resposta é simples, por motivo de segurança o Javascript não permite chamadas “http” para outros URL que não seja o URL origem do código.

Posts Relacionados

Tags: , , ,



1 Comentário

You must be logged in to post a comment.