Desenvolvimento - Delphi
Delphi: Como usar o PocketSOAP para conectar-se a um serviço de SOAP com attachments no padrão MIME?
O SOAP é um protocolo para a troca de mensagens entre programas, usando uma rede de comunicação. Este é um dos protocolos usados na criação de WebServices.
por Alexandre Rocha Lima e MarcondesGeralmente servidores SOAP são implementados utilizando-se servidores HTTP, embora isto não seja uma restrição para funcionamento do protocolo. As mensagens SOAP são documentos XML que aderem a uma especificação fornecida pelo W3C (http://www.w3c.org).
O PocketSOAP é um projeto de Software Livre seguindo a licença do Mozilla (MPL) que implementa um componente COM que age como cliente SOAP para sistemas da família Windows. Originalmente criado para funcionar em PocketPC (daí o nome), há também uma versão Win32 que funciona em Windows 95/98/Me/NT4/2000/XP/2003. O pacote inclui a implementação de transporte HTTP 1.para fazer pedidos SOAP baseados em HTTP, entretanto a implementação do transporte está separada da implementação do SOAP, então diversos outros transportes podem ser facilmente adicionados. O excelente parser de XML Expat, de James Clark, é usado para interpretar as respostas das mensagens SOAP.
O protocolo básico de transmissão de email na Internet, o SMTP, suporta apenas caracteres ASCII com 7 bits. Isto efetivamente limita as mensagens de email à mensagens que, quando transmitidas, incluem apenas os caracteres usadas para a língua inglesa. O padrão MIME define mecanismos para enviar outros tipos de informações em emails, incluindo textos em outras línguas, que não a inglesa, usando codificações de caractere diferentes do ASCII, assim como arquivos binários como imagens, sons, filmes e programas de computador. O padrão MIME é também um componente fundamental de protocolos de comunicação como o HTTP, que requer que dados sejam transmitidos em um contexto similar ao das mensagens de email, mesmo que os dados não sejam realmente um email.
Para usar o PocketSOAP, Primeiramente você deve fazer o download e instalar o componente (http://www.4s4c.com/pocketsoap/), então deve importar o COM, seguindo os screenshots, para criar o arquivo PocketSOAP_TLB :
1. Vá ao menu "Project" -> "Import Type Library..."
2. Quando abrir o diálogo, marque o checkbox "Generate Component Wrapper" e selecione "PocketSOAP 1.x.x Type Library", então clique no botão "Create Unit".
3. Agora grave o arquivo PocketSOAP_TLB para o uso posterior.
Agora você pode criar um novo projeto e colocar o arquivo PocketSOAP_TLB nas cláusulas de uso (uses). O exemplo que segue conecta a um serviço de SOAP para receber um attachment, como eco, usando MIME:
uses PocketSOAP_TLB;
Declare as seguintes variáveis num método qualquer, à sua escolha:
var mgr: IAttachmentManger; atts: ISoapAttachments; att: ISoapAttachment; env: ISOAPEnvelope; http: IHTTPTransportAdv; st: ISOAPTransport; params: ISOAPNodes; n: ISOAPNode; Location: AttachmentLocation; Value: OLEVariant; serialize, uri, href: WideString;
Para criar o wrapper do serviço SOAP, use o seguinte código:
begin env := CoCoEnvelope.Create; env.Set_EncodingStyle(""); env.SetMethod("echo", "urn:EchoAttachmentsService");
Para criar o gerenciador de attachments SOAP, use o seguinte código:
mgr := CoCoAttachmentManager.Create; mgr.Set_Format(formatMime); env.Get_URI(uri); env.Get_Parameters(params); params.Create("source", Unassigned, "", "", "", n); mgr.Get_Request(atts); atts.Create("c:\image.gif", tnfMediaType, "application/octectstream", att); att.Get_Uri(uri); n.Set_href(uri);
Para criar o manipulador de transporte HTTP, use o seguinte código:
http := CoHTTPTransport.Create; http.Set_SOAPAction("test"); mgr._Set_Transport(http); st := mgr as ISOAPTransport; env.Serialize(serialize); st.Send("http://soap.4s4c.com/axis/servlet/AxisServlet", serialize);
Para pegar o resultado da chamada SOAP, use o seguinte código::
env.Parse(st, ""); att := CoCoSoapAttachment.Create; env.Get_Parameters(params); env.Get_URI(uri); params.Get_Item(0, n); n.Get_href(href); mgr.Get_Response(atts); atts.Find(href, att); att.Get_Located(Location); if Location = attInMemory then att.Save("c:\att.gif"); att.Get_body(Value); ShowMessage(Value); end;