Vejamos a seguir nesta publicação, como consumir um webServices SOAP no Magic xpa 4.x usando o MS.WCF
São várias as opções que temos disponíveis no Magic xpa 4.x para o consumo de webServices SOAP, a partir de um WSDL existente:
- Invoke WS Lite
- WCF Client
- HTTP Post Operation
- Apache AXIS2
Neste post, vamos abordar e exemplificar a opção 2: Consumo de WS SOAP com o MS.WCF.
(em outras publicações falaremos das demais opções)
Esta (WCF) é uma opção mono plataforma: serve somente para o SO Windows.
Mas antes, vamos abordar as “pré-condições” para utilização deste recurso.
Pré-Requisitos
MS.NET FrameWork 4.6.2 (ou >)
Vem por default na instalação/atualização do Windows. Mas se sua versão for inferior a esta por exemplo, pode ser necessário instá-lo (caso já não esteja) manualmente na máquina.
É um pré-requisito do Magic xpa Studio e também do Magic xpa Runtime.
DNet FW 4.8 = https://dotnet.microsoft.com/download/dotnet-framework/net48
O Script PowerShell (executado como ‘Admin‘ da máquina) abaixo permite consultar quais as atuais versões do DNet FW estão atualmente presentes:
Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' -recurse | Get-ItemProperty -name Version,Release -EA 0 | Where { $_.PSChildName -match '^(?![SW])\p{L}'} | Select PSChildName, Version, Release, @{ name="Product" expression={ switch -regex ($_.Release) { "378389" { [Version]"4.5" } "378675|378758" { [Version]"4.5.1" } "379893" { [Version]"4.5.2" } "393295|393297" { [Version]"4.6" } "394254|394271" { [Version]"4.6.1" } "394802|394806" { [Version]"4.6.2" } "460798|460805" { [Version]"4.7" } "461308|461310" { [Version]"4.7.1" } "461808|461814" { [Version]"4.7.2" } "528040|528449" { [Version]"4.8" } {$_.Release -gt 528449} { [Version]"Undocumented version (> 4.8), please update script" } } } }
MS.NET FrameWork SDK Developer Pack 4.6.2 (ou >)
Este possivelmente precise ser instalado à parte, caso já não o tenha (para atender outros sistemas por exemplo).
DNet FW NDK 4.8 = https://dotnet.microsoft.com/download/visual-studio-sdks
É um pré-requisito do Magic xpa Studio somente.
Uma vez instalado, a sua pasta pode ser adicionada ao PATH do Windows:
SET PATH=C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools;<restante do PATH>
e a ferramenta “SvcUtil.EXE” precisa ser informada no MAGIC.INI, na seção [MAGIC_ENV], chave SvcUtilPath:
Consumindo o Serviço Web – Gerando a classe “Proxy”
Resolvidas as questões dos pré-requisitos, o próximo passo é ter a posse do WSDL do(s) serviço(s) que necessitamos acessar e codificar sua chamada no Magic xpa.
Neste exemplo vamos utilizar o https://www.dataaccess.com/webservicesserver/TextCasing.wso?WSDL, método InvertStringCase:
*Nota: Este WS simples recebe um texto como argumento e inverte suas letras maiúsculas em minúsculas, e vice-versa.
Devemos acessar o CRR do nosso projeto a adicionar uma novo componente do tipo “WCF Client“:
Em seguida, executamos o ZOOM (F5) neste novo componente e informamos ao assistente o WSDL do serviço (que pode ser uma URL ou um arquivo em disco).
Ao clicar “OK”, o Magic xpa Studio vai invocar o MS.WCF (<…>SvcUtil.exe [ … ] ), gerando um assembly DLL com o código .NET que faz o consumo deste webService.
Este módulo cliente de consumo é colocado na pasta %EngineDir%\WCFClientModules:
E passa a ser a referência interna no componente que acabamos de criar no CRR.
*Nota: Esta pasta %EngineDir%\WCFClientModules precisa ser levada para o ambiente do Magic xpa Runtime, que vai executar este projeto.
Consumindo o Serviço Web – Programando a chamada do Serviço
Tendo gerado a classe .NET de consumo, o passo final é a codificação no programa Magic xpa da chamada deste serviço.
Como é um componente MS.WCF (.NET), isso é feito através de variáveis do tipo .NET nos programas.
Geralmente (mas não é regra imutável), uma chamada vai requerer 5 classes:
- Stub = É a classe geral do serviço que foi decodificado e convertido em código .NET. Ela abrange todos os métodos listados no WSDL.
- Request = É a classe que define o “corpo” (body) de envio do método que será invocado.
- Request Body= É a classe que define o objeto com os “parâmetros de entrada” (caso existam) do método que será invocado.
- Response = É a classe que define o objeto com o “retorno” (caso exista) do método que será invocado.
- Response Body = É a classe que define o “corpo” (body) dentro do conteúdo do “retorno” (caso exista) do método que será invocado.
Para nosso método de exemplo (InvertStringCase), essas classes foram geradas como:
- Client = mgWcfClient.TextCasing.TextCasingSoapTypeClient
- Request = mgWcfClient.TextCasing.InvertStringCaseRequest
- Request BODY = mgWcfClient.TextCasing.InvertStringCaseRequestBody
- Response = mgWcfClient.TextCasing.InvertStringCaseResponse
- Response BODY = mgWcfClient.TextCasing.InvertStringCaseResponseBody
Estes são justamente os tipos de dados das variáveis .NET do nosso programa Magic xpa:
Tendo as variáveis definidas, em algum ponto do programa (ex: Task Prefix) é necessário instanciá-las (criar seus objetos), através da chamada dos seus construtores (exceto ‘Response’ e ‘ResponseBody’):
DotNet.mgWcfClient.TextCasing.TextCasingSoapTypeClient( 'TextCasingSoap' ) DotNet.mgWcfClient.TextCasing.InvertStringCaseRequestBody( RTrim( <Texto de Entrada> ) ) DotNet.mgWcfClient.TextCasing.InvertStringCaseRequest( <Objeto InvertStringCaseRequestBody Acima> )
*Nota: Este formato acima não é uma regra geral. Vai variar de serviço para serviço, método para método, a forma como devem ser preenchidos os argumentos de entrada.
Como este método (InvertStringCase) recebe um argumento (uma ‘string’), devemos preenchê-lo na classe RequestBody. E como um objeto acaba sendo parâmetro do construtor de outro, a ordem de instanciação é muito relevante.
*Nota: Diferente do JAVA, onde tudo é "método", no .NET existem "métodos" e "propriedades" nos objetos. Propriedades .NET podem ser atualizadas com a função DNSet().
Na sequência, é feita a chamada do método (com o objeto ‘Request‘ como argumento), e ele retorna uma instância (objeto) da classe ‘Response‘:
<Objeto CLIENT>.InvertStringCase( <Objeto REQST> )
E para finalizar, se deu tudo certo (não houver um .NET Exception), podemos extrair o resultado do objeto ‘ResponseBody‘, retornado dentro do objeto ‘Response‘:
<Objeto RESPONSEBODY>.InvertStringCaseResult
No exemplo, passamos como argumento a string ‘MAGIC SOFTWARE BRASIL‘ e o retorno do webService é este:
Baixe deste endereço um projeto exemplo com o Magic xpa 4.7, usando o MS.WCF .
Para receber os artigos do Blog Magic Brasil em primeira mão no seu email, registre-se aqui