Erros na passagem de parâmetros com SOAP e Delphi
Olá pessoal. Recentemente tive que criar uma aplicação para consumir determinado webservice usando SOAP. E esta aplicação deveria ser construída usando Delphi 7. Bem, o Delphi 7 já contava na sua época, com muitos recursos bacanas para trabalhar com SOAP, o problema é que tem alguns bugs muitos chatos, alguns inclusive, que acompanharam o Delphi até a versão 2006.
Dos bugs, o que mais me incomodou foi wizard do WSDL Importer. Sim, o Delphi 7 tem um utilitário que cria para você a interface para conversar com o serviço web, bastando ter o endereço WSDL dele (sem precisar escrever nenhuma linha de código :-] ). O WSDL Importer:
O grande problema é que este Wizard esquece de colocar esta pequena linha na unit de interface :
InvRegistry.RegisterInvokeOptions(TypeInfo(ServicosDvaSoap), ioDocument);
ServicosDvaSoap -> neste exemplo, é o nome do serviço que quer acessar.
Este código é responsável por configurar a forma de chamada para uma interface registrada. Procure no help do delphi por RegisterInvokeOptions, TinvokableClassRegistry, TIntfInvokeOption e, TintfInvokeOptions.
Usando a opção ioDocument, o Delphi entende que se trata de um webservice que usa document-style encoding, como é o caso do SOAP. Um teste interessante é usar o método onBeforeExecute do component THTTPRio para visualizar o xml gerado ao usar o comando RegisterInvokeOptions e o xml gerado sem o comando RegisterInvokeOptions.
Por isso, quando uma chamada a um método de algum webservice, via Delphi (usando SOAP) estiver falhando, lembre-se antes de tudo, de verificar se este código está na sua unit de interface do webservice. No meu caso real, um método que era pra retornar True, quando a senha passada estivesse correta, estava sempre retornando false, mesmo usando a senha correta. Só depois de um “tempo perdido”, debugando, é que fui perceber que o erro estava no RegisterInvokeOptions, bugzinho de versão antiga do delphi :-) .
Abraços.
Obs.: Testei o Delphi 2009 e este bug do WSDL Importer está corrigido.
Marcadores: Bug, delphi, HTTPRio, RegisterInvokeOptions, SOAP, TIntfInvokeOption, TintfInvokeOptions, TinvokableClassRegistry

0 Comentários:
Postar um comentário
Assinar Postar comentários [Atom]
<< Página inicial