Como consumir WebServices em Delphi
Autor: Egilson Silva | Publicado: 2011-02-20T19:14:00-03:00

Como consumir WebServices em&nbsp;DelphiE ai pessoal , tudo bem? Espero que sim…
Como é de praxe neste blog(e na minha vida em geral), vamos direto ao  assunto: WebServices já fazem parte da rotina dos programadores, seja  qual for a plataforma, e alias em Delphi é algo muito simples de se  fazer.
Primeira coisa, se quiserem testar a aplicação de vocês, recomendo que façam um cadastro no Byjg , assim vocês terão acesso a um excelente serviço de busca de CEP’s, que será usado como exemplo.
Bom,  feito o cadastro abram o Delphi (no meu caso a Versão 7) e faça  File-&gt;New-&gt;Other aba WebService, e abra “WSDL importer”
Na Caixa que segue digite o endereço do WDSL,no caso,  http://www.byjg.com.br/site/webservice.php/ws/cep?WSDL, isto fará a  importação de uma interface necessária para a utilização do  WEBSERVICE.Depois de avançar finalize, assim você verá que será criada  uma unit chamada CEP com o seguinte código.
CODE 
// ************************************************************************ //
// The types declared in this file were generated from data read from the
// WSDL File described below:
// WSDL&nbsp;&nbsp;&nbsp;&nbsp; : http://www.byjg.com.br/site/webservice.php/ws/cep?WSDL
// Encoding : utf-8
// Version&nbsp; : 1.0
// (27/3/2010 13:28:27 – 1.33.2.5)
// ************************************************************************ // unit cep;
interface
uses InvokeRegistry, SOAPHTTPClient, Types, XSBuiltIns;
type
&nbsp; // ************************************************************************ //
&nbsp; // The following types, referred to in the WSDL document are not being represented
&nbsp; // in this file. They are either aliases[@] of other types represented or were referred
&nbsp; // to but never[!] declared in the document. The types from the latter category
&nbsp; // typically map to predefined/known XML or Borland types; however, they could also 
&nbsp; // indicate incorrect WSDL documents that failed to declare or import a schema type.
&nbsp; // ************************************************************************ //
&nbsp; // !:string&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; – “http://www.w3.org/2001/XMLSchema”
&nbsp; ArrayOfstring = array of WideString;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { “urn:CEPService” }
&nbsp; // ************************************************************************ //
&nbsp; // Namespace : urn:http://www.byjg.com.br
&nbsp; // soapAction: urn:CEPServiceAction
&nbsp; // transport : http://schemas.xmlsoap.org/soap/http
&nbsp; // style&nbsp;&nbsp;&nbsp;&nbsp; : rpc
&nbsp; // binding&nbsp;&nbsp; : CEPServiceBinding
&nbsp; // service&nbsp;&nbsp; : CEPService
&nbsp; // port&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : CEPServicePort
&nbsp; // URL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : http://www.byjg.com.br/site/webservice.php/ws/cep
&nbsp; // ************************************************************************ //
&nbsp; CEPServicePort = interface(IInvokable)
&nbsp; ['{EC28595B-95D2-DE51-E5B1-57B81D4826D3}']
&nbsp;&nbsp;&nbsp; function&nbsp; obterVersao: WideString; stdcall;
&nbsp;&nbsp;&nbsp; function&nbsp; obterLogradouro(const cep: WideString): WideString; stdcall;
&nbsp;&nbsp;&nbsp;  function&nbsp; obterLogradouroAuth(const cep: WideString; const usuario:  WideString; const senha: WideString): WideString; stdcall;
&nbsp;&nbsp;&nbsp;  function&nbsp; obterCEP(const logradouro: WideString; const localidade:  WideString; const UF: WideString): ArrayOfstring; stdcall;
&nbsp;&nbsp;&nbsp;  function&nbsp; obterCEPAuth(const logradouro: WideString; const localidade:  WideString; const UF: WideString; const usuario: WideString; const  senha: WideString): ArrayOfstring; stdcall;
&nbsp; end;
function GetCEPServicePort(UseWSDL: Boolean=System.False; Addr: string=”; HTTPRIO: THTTPRIO = nil): CEPServicePort;
implementation
function GetCEPServicePort(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): CEPServicePort;
const
&nbsp; defWSDL = ‘http://www.byjg.com.br/site/webservice.php/ws/cep?WSDL’;
&nbsp; defURL&nbsp; = ‘http://www.byjg.com.br/site/webservice.php/ws/cep’;
&nbsp; defSvc&nbsp; = ‘CEPService’;
&nbsp; defPrt&nbsp; = ‘CEPServicePort’;
var
&nbsp; RIO: THTTPRIO;
begin
&nbsp; Result := nil;
&nbsp; if (Addr = ”) then
&nbsp; begin
&nbsp;&nbsp;&nbsp; if UseWSDL then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Addr := defWSDL
&nbsp;&nbsp;&nbsp; else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Addr := defURL;
&nbsp; end;
&nbsp; if HTTPRIO = nil then
&nbsp;&nbsp;&nbsp; RIO := THTTPRIO.Create(nil)
&nbsp; else
&nbsp;&nbsp;&nbsp; RIO := HTTPRIO;
&nbsp; try
&nbsp;&nbsp;&nbsp; Result := (RIO as CEPServicePort);
&nbsp;&nbsp;&nbsp; if UseWSDL then
&nbsp;&nbsp;&nbsp; begin
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RIO.WSDLLocation := Addr;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RIO.Service := defSvc;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RIO.Port := defPrt;
&nbsp;&nbsp;&nbsp; end else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RIO.URL := Addr;
&nbsp; finally
&nbsp;&nbsp;&nbsp; if (Result = nil) and (HTTPRIO = nil) then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RIO.Free;
&nbsp; end;
end;
initialization
&nbsp; InvRegistry.RegisterInterface(TypeInfo(CEPServicePort), ‘urn:http://www.byjg.com.br’, ‘utf-8′);
&nbsp; InvRegistry.RegisterDefaultSOAPAction(TypeInfo(CEPServicePort), ‘urn:CEPServiceAction’);
&nbsp; RemClassRegistry.RegisterXSInfo(TypeInfo(ArrayOfstring), ‘urn:CEPService’, ‘ArrayOfstring’);
end.Repare que há uma interface chamada “CEPServicePort”, e uma função  chamada “GetCEPServicePort” que retorna um objeto do tipo da interface  citada.Em resumo, é só usar está função para pegar o objeto e utilizar  as funções de de busca de Cep citadas nesta parte:
&nbsp; CEPServicePort = interface(IInvokable)
&nbsp; ['{EC28595B-95D2-DE51-E5B1-57B81D4826D3}']
&nbsp;&nbsp;&nbsp; function&nbsp; obterVersao: WideString; stdcall;
&nbsp;&nbsp;&nbsp; function&nbsp; obterLogradouro(const cep: WideString): WideString; stdcall;
&nbsp;&nbsp;&nbsp;  function&nbsp; obterLogradouroAuth(const cep: WideString; const usuario:  WideString; const senha: WideString): WideString; stdcall;
&nbsp;&nbsp;&nbsp;  function&nbsp; obterCEP(const logradouro: WideString; const localidade:  WideString; const UF: WideString): ArrayOfstring; stdcall;
&nbsp;&nbsp;&nbsp;  function&nbsp; obterCEPAuth(const logradouro: WideString; const localidade:  WideString; const UF: WideString; const usuario: WideString; const  senha: WideString): ArrayOfstring; stdcall;
&nbsp; end;
Muito bem, mas vamos mastigar um pouco, tem algumas manha ainda, vá até a a paleta WEBServices, e arraste um componente HTTPRIO.
Neste componente, você encontrará todas as propriedades necessárias  para se conectar a um webService, no entanto configure apenas o proxy de  houver algum, porque o restante das configurações serão retornados pela  função “function GetCEPServicePort(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): CEPServicePort; ” Reparem  que, o ultimo parâmetro de função é exatamente um componente HTTPRIO,  pois a função ira usar parte de suas configurações(que não sejam  relacionadas ao serviço em si, mas em relação a rede proxy etc.), para  retornar um objeto filho de HTTPRIO (sim um filho, olha esse retorno Result := (RIO as CEPServicePort); , pegando o componente e fazendo o polimorfismo ).
Depois da explicação terica vamos ao código:
CODE 
procedure TForm1.Button1Click(Sender: TObject);
var ser: CEPServicePort;
begin &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ser:= GetCEPServicePorT(false,”,HTTPRIO1);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memo1.text:=&nbsp;&nbsp;&nbsp;  ser.obterLogradouroAuth(Edit1.Text,’usuario’,senha’); // o usuario e  senha são aqueles que você cadastrou no site dito no começo do artigo
end;Simplesmente um botão que quando clicado, faz instãncia de um CEPServicePort, atraves da função getCEPServicePort,usando parte da configuração feita no componente ,HTTPRIO1; 
Depois é só usar qualquer método declarado na interface CEPServicePort , e no nosso caso usaremos o método obterLogradouroAuth., e simplesmente&nbsp; jogar o valor do Lagradouro em um MEMO,

Ressaltando que quase todos os WebServices trabalham da mesma forma,  alguns métodos de interfaces geradas retornam tipos especificos, mas  basta usá-los pois estarão disponíveis na unit baixada através do WSDL;
é isso ai… qualquer dúvida ou sugestão? deixe nos recados!