Nouvelle publication

検索

Article
· Oct 10, 2024 10m de lecture

Desenvolvendo Intergrações com o InterSystems IRIS - SOAP Inbound Adapter

Projeto 1 - Integração utilizando SOAP Inbound Adapter

A idéia deste novo conjunto de postagens é apresentar uma série de integrações utilizando o InterSystems IRIS. Vamos ver integrações REST, SOAP, utilizando adaptadores ODBC, Arquivos e outros.

Vamos montar nossa primeira integração completa, passando pelas camadas de BS, BP e BO, e devolvendo a resposta esperada. Vamos montar essa nossa primeira integração utilizando o SOAP como o adaptador de entrada, e como cliente vamos utilizar o SoapUI.

Vamos então começar:

1. SoapUI

Baixe o SoapUI do site de download dele (https://www.soapui.org/downloads/soapui/) Nesta tela você poderá optar por baixar o SoapUI Open Source conforme a tela abaixo:

 

 

Baixe e instale o produto. Ao executar você verá a seguinte tela:

Pronto. Você já está com o SoapUI instalado e pronto para realizar os testes na sua integração.

2. IRIS

Agora vamos para o IRIS. Após instalar o IRIS e criar um namespace com a opção de Interoperabilidade ativada, vamos então criar as mensagens que vão fazer parte da nossa integração. Vamos criar um Request e um Response conforme abaixo:

Class ws.demo.msg.Request Extends Ens.Request
{

Property string1 As %String;

Property string2 As %String;

}

 

Class ws.demo.msg.Response Extends Ens.Response
{

Property saida As %String;

Property status As %Boolean;

Property mensagem As %String;

Property sessionId As %Integer;

}

 

Note que Request tem como superclasse Ens.Request e Response tem como superclasse Ens.Response. Isso é importante para que as funcionalidades do barramento estejam disponíveis nas mensagens. Após criar nossas mensagens de Request e Response Vamos criar nosso BS, que é quem vai receber as requisições:

Class ws.demo.bs.Service Extends EnsLib.SOAP.Service
{

Parameter ADAPTER = "EnsLib.SOAP.InboundAdapter";

Parameter SERVICENAME = "entrada";

Method entrada(pInput As ws.demo.msg.Request) As ws.demo.msg.Response [ WebMethod ]
{
              Set tSC=..SendRequestSync("bpEntrada",pInput,.tResponse)
              If $$$ISERR(tSC) Do ..ReturnMethodStatusFault(tSC)
              Quit tResponse
}

}

 

Note que nosso BS tem como superclasse EnsLib.DSOAP.Service e usa o adaptador EnsLib.SOAP.InbloudAdapter. Isso habilita nosso BS a trabalhar como um BS SOAP, recebendo as requisições neste padrão.

Agora vamos criar nosso BO conforme abaixo:

Class ws.demo.bo.Operation Extends Ens.BusinessOperation [ ProcedureBlock ]
{
Method entrada(pRequest As ws.demo.msg.Request, Output pResponse As ws.demo.msg.Response) As %Library.Status
{
 Set pResponse=##Class(ws.demo.msg.Response).%New()
 Set pResponse.status=1
 Set pResponse.mensagem="OK"
 Set pResponse.sessionId=..%SessionId
 Set pResponse.saida=pRequest.string1_" "_pRequest.string2
 Quit $$$OK
}
XData MessageMap
{
<MapItems>
              <MapItem MessageType="ws.demo.msg.Request">
                            <Method>entrada</Method>
              </MapItem>
</MapItems>
}

}

Aqui no BO temos a estrutura XData que recebe qual a classe que vai chegar e direciona para o método que deve tratar aquela etrada.

Note também que neste BO não estamos utilizando nenhum adaptador. Ele trabalha sem fazer chamadas externas. Desta fora não vamos precisar para este exemplo de nenhum tipo de comunicação. As próximas integrações já teremos chamadas externas.

Agora, por fim, vamos montar nosso BP, que é o orquestrador das chamadas da integração. No nosso exemplo teremos apenas uma única chamada, mas nosso BP poderia orquestrar chamadas para diversos BOs.

 

O código do nosso BP ficará assim:

/// 
Class ws.demo.bp.entrada Extends Ens.BusinessProcessBPL [ ClassType = persistent, ProcedureBlock ]
{ /// BPL Definition
XData BPL [ XMLNamespace = "http://www.intersystems.com/bpl]
{
<process language='objectscript' request='ws.demo.msg.Request' response='ws.demo.msg.Response' height='2000' width='2000' >
<sequence xend='200' yend='350' >
<call name='boEntrada' target='boEntrada' async='0' xpos='200' ypos='250' >
<request type='ws.demo.msg.Request>
<assign property="callrequestvalue="requestaction="set" languageOverride="" />
</request>
<response type='ws.demo.msg.Response>
<assign property="responsevalue="callresponseaction="set" languageOverride="" />
</response>
</call>
</sequence>
</process>
} Storage Default
{
<Type>%Storage.Persistent</Type>
}

}

Agora vamos criar nossa production e colocar as classes nela. Vamos no Painel de Administração->Interoperabilidade e vamos configurar uma nova produção, lembrando que a classe da produção já está no pacote de download:

Clique em Novo e preencha a tela a seguir:

 

Clique em OK e a produção estará criada. Agora clique no botão (+) ao lado do título Services para incluir o nosso BS na produção:

 

Preencha a tela conforme acima e clique em OK.

 

Pronto. O BS já está na production. Agora clique em OK na tela que está apresentada para voltar a tela da produção.

A seguir cliqye no botão (+) ao lado do título Process para incluir o nosso BP:

 

Preencha a tela conforme acima e clique em OK.

 

 

Pronto. Nosso BP já está na produção. Agora clique em OK para voltar a tela de configuração da produção. E então vamos clicar no botão (+) ao lado do título Operations:

 

Preencha a tela conforme acima, clique em OK e teremos nosso BO na produção.

 

 

Agora clique em OK para voltarmos a tela de configuração da produção:

 

 

Temos nossos 3 componentes configurados na produção. Clique na bola verde ao lado de bpEntrada para ver as conexões entre os componentes:

 

 

 

 

 

Agora clique sobre o nome do nosso BS expanda a área Parâmestros de Conexão e marque a caixa Habilitar Requisições Padrão, conforme a tela a seguir:

 

Feita a configuração da produção nossa integração está pronta para uso. Abra o SoapUI e vamos agora importar nosso WSDL. O WSDL é a definição do serviço SOAP. Caso você queira ve-lo antes da importação abra um navegador e vá para o endereço http://localhost/csp/<namespace>/ws.demo.bs.Service.cls?WSDL=1 onde <namespace> é o nome do namespace que você criou para armazenar sua integração. No nosso caso o namespace se chama integra:

 

 

Então, voltando ao SoapUI, vamos importar nosso WSDL:

 

Abra o SoapUI e no menu File clique em New Soap Project:

 

 

 

Preencha a caixa Initial WSDL com o endereço do nosso WSDL. O SoapUI vai preencher sozinho a caixa Project Name. A seguir clique em OK

Abra o treeview do projeto até chegar em Requst 1. Clique neste titulo e você verá a tela com as informações para chamar o serviço:

 

 

Preencha string 1 e string 2 com o que você quiser, seu nome e sobrenome por exemplo, e clique na seta verde de play. Você verá então a resposta do serviço na janela ao lado:

 

 

Pronto! Realizamos a chamada do nosso serviço e foi devolvida a resposta:

 

<?xml version="1.0" encoding="UTF-8" ?>

<SOAP-ENV:Envelope xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:s='http://www.w3.org/2001/XMLSchema'>

<SOAP-ENV:Body><entradaResponse xmlns="http://tempuri.org">

<entradaResult><saida>Abel Silva</saida>

<status>true</status>

<mensagem>OK</mensagem>

<sessionId>17</sessionId>

</entradaResult></entradaResponse>

</SOAP-ENV:Body>

</SOAP-ENV:Envelope>

 

Agora podemos voltar a nossa produção e ver o trace da nossa integração. Clique sobre o nome do nosso BS e a seguir clique em Mensagens e a seguir em Ir para o Visualizador de mensagens. Localize o SessionID que você recebeu na sua resposta e clique neste número. Então você verá o trace da nossa integração:


Veja que você pode ver o que cada componente recebeu, o tempo de duração de cada chamada, o que foi devolvido e o fluxo geral da integração. Isso é especialmente útil para você administrar ambientes complexos e com grande número de integrações, além de permitir que em caso de necessidade você possa reenviar uma mensagem que por algum motivo não tenha sido processada.

 

 

 

 

Agora, caso se deseje incluir uma autenticação no serviço, vamos primeiro precisar criar um usuário. Vamos em Portal de Administração/ Segurança/Usuarios e clique em Criar Novo Usuário:

 

Preencha a tela conforme acima. Informe a senha desejada e lembre de marcar as caixas ‘A senha nunca expira’ e ‘A conta nunca expira’ para que a conta esteja ativa. Você pode aqui colocar as opções de expiração de acordo com o que seu ambiente exija de segurança. Para nosso teste vamos deixar sem expiração.

Após salvar o usuário clique em Roles e selecione a Role %All para este usuário. Clique em Associar. Esta role %All dará total acesso ao seu ambiente para este usuário.

Pronto. O usuário está criado. Podemos criar um usuário com acesso mais restrito, mas no nosso caso não estamos avaliando a questão de segurança e nível de acesso, apenas determinando que o serviço tenha autenticação. Em próximas etapas veremos a parte de segurança do IRIS que é bem completa.

IMPORTANTE: Depois, se for o caso, exclua este usuário do seu ambiente. Ele tem acesso FULL a sua instancia IRIS.

Agora vá em Administração do Sistema/Segurança/Aplicações/Aplicações Web e procure a aplicação web referente ao seu namespace. No nosso caso /csp/integra:

 

Procure a sessão Métodos permitidos para autenticação, desmarque a caixa Não Autenticado e marque a caixa Senha, e a seguir clique em Salvar.


Volte ao SoapUI e novamente clique no botão de Play. Você verá que agora o SoapUI recebeu um erro da integração:

 

<?xml version='1.0' encoding='UTF-8' standalone='no' ?>

<SOAP-ENV:Envelope xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:s='http://www.w3.org/2001/XMLSchema' xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secex..." >

  <SOAP-ENV:Body>

    <SOAP-ENV:Fault>

      <faultcode>wsse:FailedAuthentication</faultcode>

      <faultstring>The security token could not be authenticated or authorized</faultstring>

      <detail></detail>

    </SOAP-ENV:Fault>

  </SOAP-ENV:Body>

</SOAP-ENV:Envelope>

 

Veja que o serviço informou que não pode validar o token de segurança pois o mesmo não foi informado. Vamos criar esse token alterando a Request Properties do serviço, logo abaixo na tela do SoapUI:

 

 

Informe o nome do usuário, senha e na caixa WSS-Password Type selecione PasswordText. Agora reenvie a sua requisição e você terá a resposta correta:

 

 

3. TCPTRACE

Uma ferramenta muito útil quando estamos trabalhando com integrações é o TCPTrace que permite verificar o tráfego TCP de uma conexão. Vamos colocar o TCPTrace para rodar e configurar nosso ambiente para vermos o trace das informações. Execute o TCPTrace do seu local de instalação:

 

 

Você verá a tela de configuração. Essa configuração diz ao TCPTrace para monitorar a porta 8080 e repassar o que receber para a porta 80. Preencha como acima e clique em OK. Agora volte ao SoapUI e vamos dizer que o serviço deve se comunicar com a porta 8080 que é a que o TCPTrace está “escutando”:

 

Logo após o localhost do endereço do serviço informa que a porta é a 8080. O endereço completo ficará assim:

http://localhost:8080/csp/integra/ws.demo.bs.Service.cls

 

Clique novamente no botão de Play e veja a tela do TCPTrace:

 

 

Todo o tráfego foi registrado, tanto do envio do SoapUI quanto do retorno do serviço. Podemos ver, por exemplo o token de segurança do nosso serviço:

<wsse:UsernameToken wsu:Id="UsernameToken-6780B0C4521A4F63E517261668857132"><wsse:Username>service</wsse:Username><wsse:PassworIntegrações utilizando o InterSysted Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-p...">123</wsse:Password>

IMPORTANTE: Aqui estamos usando o que chamamos de Basic Auth, ou seja uma autenticação básica. Os dados de usuário e senha são enviados no header do pacote sem criptografia. Em produção devemos para este caso estar usando um protocolo HTTPS para que o pacote seja criptografado. A ativação do HTTPS envolve um certificado a ser instalado no seu web server (IIS, Apache ou outro suportado pelo IRIS).

Assim fechamos nossa primeira integração. As classes envolvidas estão no pacote de download, basta baixar o pacote e importar para dentro do seu namespace. Após isso você pode abrir todas as classes e verificar todos os pontos.

Utilizamos em nosso teste o IRIS 2024.1, o SoapUI e o TCPTrace. Todos estão disponíveis para download nas suas versões Community na internet.

Até a próxima integração!

4 Comments
Discussion (4)4
Connectez-vous ou inscrivez-vous pour continuer
Question
· Oct 4, 2024

Connection problem with %SQLGatewayConnection

I'm trying to make a connection to an external database using %SQLGatewayConnection, but the connection always fails. DSN properly configured. I try to make the same connection through isql in bash, and the connection is successful.

This same connection fails in Caché.

5 Comments
Discussion (5)1
Connectez-vous ou inscrivez-vous pour continuer
Question
· Oct 3, 2024

MRN Field

What table would I find the MRN in? I'm trying to write a crystal report and pull that field, but I cannot seem to find it in any of the tables, to be able to add to the report.

Thank you in advance for any help.

2 Comments
Discussion (2)2
Connectez-vous ou inscrivez-vous pour continuer
Question
· Oct 3, 2024

Cómo llamar a un BO desde otro BO

Hola a todos.

Me pregunto si es posible llamar a un Business Operation desde otro Business Operation.

Tengo un Business Operatoin que escribe trazas en una base de datos, usando un mensaje personal. Puedo crear un set obj=##class(MyLogs).%New() pero el BO tiene todos los parámetros para conectares.

¿Es esto posible?

Saludos cordiales

1 Comment
Discussion (1)2
Connectez-vous ou inscrivez-vous pour continuer
Annonce
· Oct 2, 2024

InterSystems Open Exchange Applications Digest, September 2024

Hello and welcome to the September 2024 Open Exchange Newsletter.
General Stats:
19 new apps in
598 downloads in
995 applications all time
36,919 downloads all time
2,865 developers joined
New Applications
iterm
By Dmitry Maslennikov
Code-Scanner
By Robert Cemper
iris-DataViz
By Muhammad Waseem
ks-iris-lib
By Robert Barbiaux
iris-ccd-devtools
By Chi Nguyen-Rettig
db-management-tool
By Andrii Mishchenko
iris-dev-codeinspector
By Rodolfo Moreira
IRIS-API-Template
By Samuel Thomas
IRIS-Log-Monitor
By sara aplin
sql-embeddings
By Henrique Dias
pxw-lib-sql
By Paul Waterman
IPM in VS Code
By John Murray
smart-day-hands-on
By Netanel Frankel
Irisheimer
By Zacchaeus Chok
IOP REST Client Framework
By Antoine Dhollande
thalamus-og
By Audrey Chen
IRIS-Test-Data-Generator
By Dylan Cole
iris-api-interface-generator
By Alex Alcivar
VectorSearchOnPatientSimilarity
By Lin Zhu
New Releases
errors-global-analytics by Evgeny Shvarov
v1.1.1
upgrade to dsw 4+
v1.1.2
ipm version bump
iris-embedded-python-template by Evgeny Shvarov
v3.0.1
fix byRef signature for Embedded Python method
Healthcare HL7 XML by Alberto Fuentes
v3.6.0
  • Fixed installation issues
  • Fixed pre/post 2024 ReadRawDataStream / GetFieldStreamRaw in ITB.HL7.Format.HL7XMLv2
zpm-registry by Evgeny Shvarov
v1.3.1
Added 2 query params includePrerelease and includeSnapshots when searching for compatible versions of a package.
v1.3.2
fix: include prerelease and snapshot by default for compat with older zpm
DeepSeeWeb by Anton Gnibeda
v4.0.9
  • internal build with dev feature for oAuth
v4.0.10
  • fixed issue with addons loading when DSW uses authentication (#331)
v4.0.11
  • internal build with dev feature for oAuth
v4.0.12
  • internal build with dev feature for oAuth
iris-datapipe by Alberto Fuentes
v2.0.1
  • Delayed processing option available
v2.0.2
  • Fixed installation error on IRIS 2022 version
Intersystems-Monitoring by Teunis Stolker
v1.0.17
Use excepton.Data instead of exception.data
v1.0.18
Fixed a mistake for the HTTP status code filter.
v1.0.19
Removed space from behind version number; this was causing install errors
Samples-Aviation by Evgeny Shvarov
v1.0.4
Docker environment simplified
DX Jetpack for VS Code by John Murray
v2024.0.0
2024 edition for Developer Tools Contest, containing three new extensions.
IRIS apiPub by Claudio Devecchi
v1.1.72
improvements & bug fixes
v1.1.73
bug fixes & improvements
apptools-admin by Sergey Mikhailenko
v1.2.6
Enabled support for Django projects via the native Python API library.
Git for Shared Development Environments by Timothy Leavitt
v2.5.0

[2.5.0] - 2024-09-24

Added

  • New UI for the basic mode Sync (#415)
  • Allow changing namespaces and IPM package context from web UI (#280)
  • Support for editing repo from filesystem perspective via web application (#464)
  • Support for downloading a VSCode workspace file from web UI
  • IncrementalLoad pull event handler will update the running production, if any (#473)

Fixed

  • Instance wide settings are placed in proper global (#444)
  • Avoid delay/errors in loading interop JS when there is a URL prefix (e.g., instance name in multi-instance webserver configuration)
  • Added proper JS escaping in sync output
  • Added support to switch branch in basic mode from menu (#451)
  • Pull event handler will not fail when change set includes unmapped files (#453)
  • Pull event handler will attempt compile even if there are failures to load (#457)
  • Improved logging in preview and when errors occur via WebSocket commands (#467)
  • Fixed pull event handler handling of extremely long class names from diff (#467)
  • Fixed Git web UI prompt to update file list when file selected/unselected (#478)
  • Fixed folder settings in mappings to be saved and persist (#483)
  • Preview on the pull.csp page now shows commits from the correct branch (#490)
Most downloaded
MDX2JSON
By Eduard Lebedyuk
DeepSeeWeb
By Anton Gnibeda
WebTerminal
By Nikita Savchenko
ssl-client
By Evgeny Shvarov
iris-bi-utils
By Evgeniy Potapov
interoperability-embedded-python
By Guillaume Rongier
iris-cron-task
By Evgeny Shvarov
isc-json
By Timothy Leavitt
iris-web-swagger-ui
By Maks Atygaev
, 2024Month at a GlanceInterSystems Open Exchange
Discussion (0)1
Connectez-vous ou inscrivez-vous pour continuer