Desenvolvimento - Delphi
Delphi: Como usar o PocketSOAP para conectar-se a um serviço de SOAP com attachments no padrão DIME?
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.
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.
A transferência de arquivos, usando o padrão DIME, é possível com o PocksetSOAP. DIME (Direct Internet Message Encapsulation) é um padrão proposto pela Microsoft para a transferência de dados binários e outros formatos encapsulados sobre o protocolo SOAP. De acordo com o site do IETF, este padrão foi abandonado e nunca chegou a se tornar um RFC (apesar de ter sido adotado pela Microsoft). O padrão é supostamente uma versão light do padrão MIME.
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 DIME:
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, nodes: ISOAPNodes; nr, n: ISOAPNode; Value: OLEVariant; Location: AttachmentLocation; 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("echoAttachments", "http://xsd.prototypes.4s4c.com/dime/");
Para criar o gerenciador de attachments SOAP, use o seguinte código:
mgr := CoCoAttachmentManager.Create; mgr.Set_Format(formatDime); env.Get_URI(uri); env.Get_Parameters(params); params.Create("attachments", Unassigned, uri, "", "", nr); env.Get_URI(uri); nr.Get_Nodes(nodes); nodes.Create("attachment", Unassigned, uri, "", "", 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/dime2/sf.soap", serialize);
Para pegar o resultado da chamada SOAP, use o seguinte código::
env.Parse(st, ""); env.Get_Parameters(params); env.Get_URI(uri); params.Get_ItemByName("attachment", uri, 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;