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 Marcondes



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.

Geralmente 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;
Alexandre Rocha Lima e Marcondes

Alexandre Rocha Lima e Marcondes - Um empreendedor que está aprendendo e usando metodologias de Lean Startup, metodologias Ágeis, gerenciamento de projetos e administração de empresas para construir uma empresa de segurança que tem o produto de segurança familiar (controle parental) mais eficiente e simples de usar - o Kidux. Para isto, tem estudado o comportamento no mundo digital (Internet e Celular), efeitos da pornografia no cérebro humano e na sociedade, educação de crianças, desenvolvimento da personalidade humana e vários assuntos relacionados. Coach de executivos e profissionais de sucesso com 18 anos de experiência na área de Tecnologia da Informação. Mais de 10.000 horas de vivência como desenvolvedor de software e mais de 1000 pessoas treinadas na área. Sua vasta experiência com grupos de trabalho remoto em diversas configurações proporcionou o envolvimento em projetos com participantes em 4 continentes e mais de 35 países. Reconhecido pela qualidade de seus produtos e treinamentos. Formação Profissional em Coaching com Eliana Dutra e Cursos de Formação Internacional em Coaching pelo Integrated Coaching Institute (ICI) - Rhandy Di Stéfano. Facilitador Licenciado pela Corporate Coach U International (CCUI). Consultor em Tecnologia da Informação com Graduação em Tecnologia em Processamento de Dados. Slideshare: http://www.slideshare.net/alexandre.marcondes Facebook: http://www.facebook.com/AlexandreRLMarcondes LinkedIn: http://www.linkedin.com/in/alexandremarcondes