Rechercher

Article
· Oct 14, 2024 4m de lecture

Desenvolvendo Integrações com o InterSystems IRIS - Aplicação REST

Projeto 3 – Requisição REST

Vamos montar nossa próxima integração utilizando uma aplicação REST. Para tal vamos utilizar um BS que chamará o BP do nosso serviço demo (ver Primeira Integração). Vamos reaproveitar o serviço que então poderá ser chamado via SOAP ou REST. Teremos então dois BS que irão chamar o mesmo BP. A imagem abaixo ilustra essa arquitetura:

O primeiro passo vai ser criar um novo BS que não terá nenhum adaptador. Esse BS será chamado pela nossa aplicação REST que veremos mais a frente:

Class ws.rest.bs.Service Extends Ens.BusinessService
{

Parameter SERVICENAME = "entrada";

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

}

 

Note que utilizamos o mesmo Request e Response do serviço que vimos na primeira integração, e chamamos o mesmo BP.


Agora vamos montar nossa aplicação REST e depois publica-la no IRIS:

Class ws.rest.api.Entrada Extends %CSP.REST
{

XData UrlMap
{
<Routes>
        <Route Url="/entrada" Method="GET" Call="Entrada"/>
</Routes>
}

ClassMethod Entrada() As %Status
{
              Set obj=##Class(ws.demo.msg.Request).%New()
    Set obj.string1=%request.Get("string1")
    Set obj.string2=%request.Get("string2")
    Set tSC=##Class(Ens.Director).CreateBusinessService("ws.rest.bs.Service",.tService)
    If tSC
    {
                  Set resp=tService.entrada(obj)
    } Else {
                  Set resp=##Class(ws.demo.msg.Response).%New()
                  Set resp.status=0
                  Set resp.mensagem=$SYSTEM.Status.GetErrorText(tSC)
    }
    Set saida = {}
    Set saida.saida=resp.saida
    Set saida.status=resp.status
    Set saida.mensagem=resp.mensagem
    Set saida.sessionId=resp.sessionId
    Write saida.%ToJSON()
    Quit $$$OK
}

}

 

Veja que usamos a chamada ENS.Director para acessar o BS ws.rest.bs.Service que colocamos na production.

Para maiores informações sobre a criação de aplicações REST veja o documento em https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls?KEY=GREST_csprest e quanto a Ens.Director veja em https://docs.intersystems.com/latest/csp/documatic/%25CSP.Documatic.cls?...

Agora que temos nossa aplicação REST desenvolvida vamos publica-la. Para isso vá no Portal de Administração no caminho Administração do Sistema->Segurança-Aplicações-Aplicações Web. Vamos criar uma nova aplicação Web de nome /api/entrada conforme a tela a seguir:

Salve a aplicação web que criamos. Note que você precisa apontar para o namespace onde você está montando seu código. No nosso exemplo é o namespace INTEGRA. Atente também para a marcação na caixa Habilitar REST e o preenchimento da caixa Expedir Classe com o nome da nossa classe REST.

Após salvar a aplicação web criada, vamos voltar a nossa production e incluir nela o nosso BS. Para isso clique no botão de incluir novo BS (sinal de mais ao lado do termo Services) e preencha a tela:

 

Pronto. Temos nosso BS configurado na nossa production, apontando para o BP da nossa primeira integração conforme vimos na tela no inicio deste texto que reproduzimos novamente abaixo:

Agora podemos utilizar uma ferramenta de teste para consumir o serviço. No nosso exemplo vamos usar o POSTMAN que foi baixado da internet e pode ser encontrado em https://www.postman.com/downloads/

Crie uma nova requisição REST e preencha conforme a tela a seguir:

O endereço do serviço é http://127.0.0.1/api/service/entrada onde /api/service é o nome da aplicação web que criamos anteriormente, e /entrada é a rota que queremos chamar. Passamos os parâmetros string1 e string2, enviamos a requisição e temos nossa resposta. Veja que recebemos o sessionID 2204, e com ele podemos consultar o que aconteceu:

Assim como na primeira integração podemos colocar o TCPTRACE para monitorar o tráfego da integração e verificar o que foi enviado e recebido em detalhes. Para isso ative o TCPTRACE e faça a configuração do mesmo para escutar na porta 8080 e repassar os dados recebidos para a porta 80 do nosso servidor:

Mude a configuração no POSTMAN para agora chamar o serviço na porta 8080, que é onde o TCPTRACE está esperando as chamadas. Reenvie a requisição e veja o resultado:

Agora, volte ao TCPTRACE e veja o que trafegou:

E temos o trace do integrador paea o sessionID 2208:

Neste artigo usamos o REST para receber uma requisição e reaproveitamos um serviço já desenvolvido para responder nossa requisição.

Assim fechamos nossa terceira  integração. Utilizamos em nosso teste o IRIS 2024.1 que disponível para download na sua versão Community na internet.

Discussion (0)1
Connectez-vous ou inscrivez-vous pour continuer
Article
· Oct 14, 2024 2m de lecture

Funções do lado esquerdo em ObjectScript

Em ObjectScript, você tem uma ampla coleção de funções que retornam algum valor tipicamente:

set variable = $somefunction(param1,param2, ...)

Não há nada de especial nisso.
Mas há um conjunto de funções que classifico como Funções de Lado Esquerdo
A especialidade delas é que você também pode usá-las à esquerda do operador igual como um alvo no comando SET:

set $somefunction(param1,param2, ...) = value

O motivo para levantar esse assunto é que com o IRIS 2024.1 há depois de muitos anos um "novo garoto nessa vizinhança"

$VECTOR()

Atribui, retorna e exclui dados vetoriais em posições especificadas, especialmente
set $VECTOR(MyVector , position , type) = value

Eu não quero entrar em detalhes. A documentação é realmente completa.
Há também outras 3 novas funções lado direito relacionadas a vetores: $VECTORDEFINED (),  $VECTOROP(), $ISVECTOR()  

Se você seguir os exemplos na documentação, verá que a nova função relacionada SQL TO_VECTOR ()
faz praticamente o mesmo em notação SQL (na verdade, não é visível na InterSystems SQL Reference)

Como lembrete/visão geral, uma lista das funções tradicionais do lado esquerdo:

  • $BIT – Retorna ou define o valor bit de uma posição específica numa bitstring.
  • $EXTRACT – Extrai uma substring de uma string de caractere por posição, ou substitui uma substring por posição.
  • $LIST – Retorna ou substitui elementos em uma lista.
  • $PIECE – Retorna ou substitui uma substring, usando um delimitador.
  • $WEXTRACT – Extrai uma substring de uma string de caractere por posição, ou substitui uma substring por posição, reconhecendo pares de substituição.

É uma lista curta, mas pode ser altamente eficiente em alguns casos para evitar conteúdo duplicado e manipulações confusas.

Discussion (0)1
Connectez-vous ou inscrivez-vous pour continuer
Article
· Oct 14, 2024 9m de lecture

FHIRValidation - Valide o seu próprio FHIR IG usando IRIS

Este programa de demonstração é usado para mostrar como um perfil FHIR personalizado pode ser empregado para validar a conformidade dos dados. O guia de implementação FHIR personalizado foi desenvolvido com base na Versão R4 do FHIR, e, neste exemplo, implementa a extensão do recurso Organização para validar a conformidade dos dados.

Discussion (0)1
Connectez-vous ou inscrivez-vous pour continuer
Question
· Oct 14, 2024

Using Cache, Python and pypyodbc, struggling dates

New to Python.  Attempting to use pypyodbc to select data from a table in one Cache database, and inserting into a similarly configured table in another.  Process works fine except for tables containing Date types.  NULL values in date columns are handled without issue, but when data is present, insert fails with:

An error occurred: argument 7: TypeError: 'NoneType' object cannot be interpreted as an integer.

Source table:

CREATE TABLE "SAT"."AuditAttribute" (
    "ID"                 INTEGER NOT NULL PRIMARY KEY DEFAULT $i(^SAT.AuditAttributeD),
    "AddDelete"          VARCHAR(50),
    "ConstituentId"      VARCHAR(50),
    "CreatedDate"        DATE,
    "CreatedTime"        TIME,
    "DeleteDate"         DATE,
    "DeleteTime"         TIME,
    "FinderId"           VARCHAR(50),
    "Tag"                VARCHAR(50),
    "UserName"           VARCHAR(50)
);

Target table:

CREATE TABLE "SAT_D3"."AuditAttribute_DWN" (
    "DBase"              VARCHAR(6),
    "ID_OLD"             INTEGER,
    "AddDelete"          VARCHAR(50),
    "ConstituentId"      VARCHAR(50),
    "CreatedDate"        DATE,
    "CreatedTime"        TIME,
    "DeleteDate"         DATE,
    "DeleteTime"         TIME,
    "FinderId"           VARCHAR(50),
    "Tag"                VARCHAR(50),
    "UserName"           VARCHAR(50)
)
;

select query:

 

select_query = 'select \'DWN\' as DBase, ID as "ID_OLD", AddDelete, ConstituentId, Tag, UserName, "CreatedDate" from SAT.AuditAttribute'

insert_query = 'insert into SAT_D3.AuditAttribute_DWN (DBase, "ID_OLD",  AddDelete, ConstituentId, Tag, UserName, "CreatedDate") values (?,?,?,?,?,?,?)'

Displaying row[6[ for first failing row shows this: "datetime.date(2018, 6, 28)"

Have tried various methods, datetime.strftime(),  datetime.strptime(), but haven't hit on the magic strategy.  I assume it's something simple.

Thanks for your help!

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

O Concurso de Tutoriais Técnicos InterSystems IRIS está começando!

Olá Desenvolvedores! 

Tenho o prazer de anunciar que hoje inicia o novo concurso da nossa Comunidade de Desenvolvedores InterSystems.

 

Aproveite a chance de se aprimorar e compartilhar aprendizados com a Comunidade de Desenvolvedores, e concorrer a prêmios excelentes. 
Todas as informações e regras estão publicadas no anúncio ✍️ Concurso de Tutoriais Técnicos InterSystems IRIS ✍️

Participe e compartilhe! 😉 

Discussion (0)1
Connectez-vous ou inscrivez-vous pour continuer