recuperando o xml de uma requisição soap em delphi

Upload: aureliano-duarte

Post on 18-Oct-2015

90 views

Category:

Documents


3 download

TRANSCRIPT

  • [Intermedirio] -Recuperando o XML de uma requisio SOAP em DelphiData: Thursday, March 20 @ 13:47:02

    Tpico Diego Garcia

    Talvez a maneira mais popular de se fazer uma integrao entre diferentes aplicaes atravs de Webservices SOAP. Inmerasaplicaes governamentais trabalham com webservices, como o caso do projeto Farmcia Popular, Nota Fiscal Eletrnica(NFe),Conhecimento de Transporte Eletrnico (CTe), etc.

    Para ajudar nesse processo, existem as definies WSDL que consiste numa espcie de documentao do webservice. Para ficarainda melhor, o Delphi est preparado para importar as definies WSDL de um webservice e j criar toda uma interface decomunicao entre a sua aplicao e o webservice, sendo necessrio somente consumir os mtodos j criados. Obviamente existeum mundo de definies e pequenos detalhes que no irei me aprofundar.

    Para mostrar o quanto tudo isso tranquilo, faremos o processo completo para o consumo de um webservice simples. O siteWebserviceX.NET (http://webservicex.net/ws/default.aspx) possui uma srie de webservices livres para testes. Usaremos owebservice Currency Convertor, um webservice responsvel por obter taxa de converso de uma moeda para outra.

    Importando o WSDLPrimeiramente (aps criar um novo projeto obviamente) iremos importar o arquivo WSDL do webservice Currency Convertor. Esseest disponvel no endereo: http://www.webservicex.net/CurrencyConvertor.asmx?WSDL.Baixe esse arquivo na sua mquina e vamos ao processo de importao no Delphi.Com o projeto criado, v em File -> New Other e depois v em Webservices -> WSDL Importer

    O processo de importar o WSDL extremamente simples, next -> next -> finish (no se preocupe com as opes, faa aimportao com a parametrizao default). Aps a importao, ser criada a unit CurrencyConvertor.pas e essa j ser adicionadaao projeto.

    Consumindo o Webservice

    :: Active Delphi http://www.activedelphi.com.br/print.php?sid=1569

    1 de 3 27/03/2014 11:17

  • Com isso seu aplicativo j est praticamente pronto para consumir o webservice, bastando apenas incluir um cdigoextremamente simples (obviamente, pelo fato do webservice ser simples).

    usesCurrencyConvertorprocedure TfrmWebserviceCliente.Converter();varoCCSoap : CurrencyConvertorSoap;beginoCCSoap := GetCurrencyConvertorSoap();tryShowMessageFmt('USD -> BRL = $%f',[oCCSoap.ConversionRate(Currency.USD,Currency.BRL)]);finallyoCCSoap := nil;end;end;

    Se voc nunca consumiu um webservice antes e est acompanhando esse post, parabens, voc acaba de consumir o seu primeirowebservice :). No cdigo acima foi convertido o valor de 1 dolar para real.

    Para saber qual mtodo voc deve executar para criar uma instancia do objeto que representa o webservice, na unit que foigerada pela importao do WSDL, basta conferir os mtodos da sesso implementation, o Delphi sempre disponibilizar um mtodocom a assinatura Get[NomeDoWebservice].

    Recuperando o contedo das mensagens.O grande problema de tudo isso que essa negociao HTTP toda, fica muito camuflada dentro das implementaes do Delphi epor algumas vezes, tive a necessidade de validar o contedo XML puro da requisio assim como o XML puro de resposta. Pararesolver esse problema, basta utilizar um componente THttpRIO e interceptar o contedo da negociao HTTP. Calma, no seassuste, isso bem simples.

    O componente THttpRio, dentre outras coisas, possui os mtodos OnBeforeExecute eOnAfterExecute, o primeiro executadoantes da requisio e o segundo aps momento da resposta. Em nosso exemplo, adicione esse componente e mais dois TMemoem seu projeto (mmRequest e mmResponse) e defina os mtodos OnBeforeExecute e OnAfterExecute do componente THttpRioda seguinte maneira.

    procedure TfrmWebserviceCliente.httpRioBeforeExecute(const MethodName: string;SOAPRequest: TStream);beginSOAPRequest.Position := 0;mmRequest.Lines.LoadFromStream(SOAPRequest);SOAPRequest.Position := 0;end;

    procedure TfrmWebserviceCliente.httpRioAfterExecute(const MethodName: string;SOAPResponse: TStream);beginSOAPResponse.Position := 0;mmResponse.Lines.LoadFromStream(SOAPResponse);SOAPResponse.Position := 0;end;

    Esse foi apenas um exemplo simplrio, mas como voc pode ver, tanto o contedo do request (SOAPRequest), quanto o contedodo response (SOAPResponse) so objetos do tipo TStream, sendo assim, voc pode manipular essa informao da maneira quefor necessria, inclusive, se necessrio, possvel manipular o request para que o contedo enviado no seja o gerado pelo Delphie sim, um contedo gerado em outra rotina. Para realizarmos o teste, vamos mudar a criao da instancia do objeto querepresenta o webservice, para que ele tenha conhecimento do nosso componente THttpRio.

    procedure TfrmWebserviceCliente.Converter;varoCCSoap : CurrencyConvertorSoap;beginoCCSoap := GetCurrencyConvertorSoap(false, EmptyStr, httpRio);tryShowMessageFmt('USD -> BRL = $%f',[oCCSoap.ConversionRate(Currency.USD,Currency.BRL)]);finallyoCCSoap := nil;end;end;

    Veja que agora estamos especificando 3 parmetros, o primeiro se nossa instancia do webservice ir utilizar o endereo do

    :: Active Delphi http://www.activedelphi.com.br/print.php?sid=1569

    2 de 3 27/03/2014 11:17

  • WSDL como endereo do servio, o segundo parmetro define qual ser o endereo final da requisio (note que o segundoparmetro anula o primeiro) e por fim, o terceiro parmetro o componente THttpRio.

    Feita a alterao, repita o teste e veja que em nossos componentes memos, esto os contedos de request e response darequisio, conforme a especificado a baixo.

    Request:

    USDBRL

    Response:

    2.349

    Acredite, realmente muito til ter em mos o contedo da requisio, pois comum que em um cenrio de integrao entreaplicaes, o fornecedor do servio, solicite opayload da requisio, ou seja, o contedo desta, para validar possveisinconsistncia.

    Disponibilizei no Gist (https://gist.github.com/drgarcia1986/9610291) os fontes completos de um projeto utilizando esses cdigosde exemplo, com algumas pequenas modificaes (crio o THttpRio de forma dinmica, fiz combos com as possveis moedas, etc.),quem tiver interesse s baixar e montar o projeto.

    Diego Garciahttp://drgarcia1986.wordpress.comhttp://twitter.com/drgarcia1986https://github.com/drgarcia1986

    Digitado por :: Active Delphihttp://www.activedelphi.com.br/

    A URL para esta notcia :http://www.activedelphi.com.br/modules.php?op=modload&name=News&file=article&sid=1569

    :: Active Delphi http://www.activedelphi.com.br/print.php?sid=1569

    3 de 3 27/03/2014 11:17