Escolar Documentos
Profissional Documentos
Cultura Documentos
Módulo I: Introdução
Introdução ao FHIR
Recursos
Sumário ....................................................................................................................... 3
Conteúdo da Unidade e Objetivos de Aprendizagem .................................................... 5
Paradigmas FHIR ......................................................................................................... 6
FHIR REST + Transações ............................................................................................... 7
O problema............................................................................................................................................ 7
Receita para Bundles de Transações (Bundle Transactions) ............................................... 10
Regras para Processamento de Transações........................................................................ 11
Respostas de Transações ................................................................................................... 11
Identificação Temporária de Recursos ............................................................................... 14
Interações Condicionais ..................................................................................................... 18
Mensageria FHIR ....................................................................................................... 20
Conceitos Básicos de Mensageria FHIR .............................................................................. 20
Lista de Eventos FHIR ........................................................................................................ 20
Identificadores de Cabeçalho da Mensagem ...................................................................... 21
Receita para Mensagens FHIR............................................................................................ 21
Processamento de Mensagem ........................................................................................... 23
Recipe for FHIR Message Responses .................................................................................. 23
Mapeamento da V2 para Mensagens FHIR ........................................................................ 25
Exemplo de Mensageria FHIR ............................................................................................ 25
O Paradigma “Não amado” (The Unloved Paradigm) ......................................................... 25
Documentos FHIR ...................................................................................................... 26
Características de Documentos Clínicos ............................................................................. 26
Estrutura de um Documento FHIR ..................................................................................... 27
Receita para documentos FHIR .......................................................................................... 27
Exemplo de documento FHIR ............................................................................................. 28
Apresentação de um documento FHIR ............................................................................... 29
Transporte de documentos FHIR........................................................................................ 29
Considerações sobre a arquitetura de documentos FHIR ................................................... 30
Documentos FHIR e CDA R2 ....................................................................................... 31
O poder do FHIR, um poder que você precisa liberar, serve para o seu caso de uso
específico e/ou cenário, você pode trocar um conjunto de recursos entre um ou mais
servidores. FHIR não se prende ao recurso, tipo, quantidade ou temporização, ou
mesmo ao tipo de transporte utilizado para a troca de dados.
Você está livre para utilizar recursos e combiná-los, e usar todos os paradigmas que
veremos nessa unidade para intercambiá-los
Essa liberdade vem com uma responsabilidade: você precisa definir respostas para
várias perguntas. Quais recursos serão intercambiados? Como esses recursos serão
combinados? Como serão relacionados? Em que momento se iniciará o
compartilhamento deles? Haverá limitação de recursos dependendo do sistema
terceiro? Quais tipos de servidores poderão publicar e quais funcionalidades eles
poderão incluir?
Ao intercambiar recursos FHIR com um outro servidor em tempo real, muitas vezes você
terá que lidar com situações onde será necessário enviar um Bundle de Resources ao
invés de um único Resource.
Você pode escolher (como cliente) usar uma interação REST para cada recurso ou usar
transações FHIR.
Figure: Múltiplos recursos como múltiplas requisições transmitidas para o servidor SHIR.
As setas bidirecionais na figura significam, no paradigma RESTful puro, assumir que não
conhecemos a lógica do servidor terceiro para cada recurso, que precisamos executar
uma busca pelo recurso e só depois fazer a transmissão do recurso, ou modifica-lo, se
necessário.
O cliente irá indicar se deseja que o processamento seja em lote (batch) ou por
transação.
A única diferença em FHIR entre um lote (batch) e uma transação é que uma transação
será bem sucedida se, e somente se, TODAS as operações forem bem sucedidas,
enquanto que um batch poderá ser parcialmente bem sucedido.
Você poderá misturar interações em uma transação ou lote (batch), incluindo múltiplas
interações em diferentes tipos de recursos. Servidores podem definir suas próprias
operações (e veremos isso nessa unidade).
Para realizar uma transação em um servidor, você precisa transmitir os dados para o
servidor FHIR [base] através de uma requisição POST em um dos formatos compatíveis
(JSON/XML).
Lembrou da palavra mágica? A palavra mágica é Bundle, pois uma transação, para o
FHIR é só um tipo específico para um Bundle, e suas próprias regras.
© 2020 HL7® Brasil & HL7® International - Proibida Reprodução 9
O conteúdo da sua requisição POST para o servidor é um recurso Bundle.
Para transações, o Bundle.type deverá assumir o valor “transaction” e para lotes deverá
ser do tipo “batch”. Bundles são compostos por entradas (Entry). Cada Entry no seu
Bundle deverá conter um recurso e uma requisição.
O recurso são os dados – data (a informação sobre o recurso que você envia para o
servidor), a requisição é a ação - action (o que fazer com os dados). Cada ação será
processada em separado e uma resposta será gerada para cada ação (O recurso foi
criado? Qual foi a ID associada?)
Lembre-se:
Em XML:
<Bundle>
<type value="transaction"/>
<entry>
<resource>
<Patient> <-- or any other ->
... Patient Resource contents
</Patient>
</resource>
<request>
<method value="POST"></method>
<url value="patient"></url>
</request>
</entry>
... (n Entries)
</Bundle>
• O servidor deverá ACEITAR todas as ações e emitir um Status HTTP 200 OK como
reposta ou REJEITAR todas as ações solicitadas e retornar um Status HTTP 400 ou 500
como resposta.
• Não há ordem obrigatória para as Entries (recursos) do seu Bundle, para serem
processados adequadamente. A ordem de processamento segue a seguinte: DELETE,
POST, PUT, GET. O servidor tentará excluir todos os recursos que você está solicitando
exclusão, depois criará todos os novos recursos e atualizará os recursos que você está
solicitando atualização. Finalmente, processará as buscas e GETs.
• Uma transação poderá incluir referências de um recurso para outro em um Bundle.
Algumas dessas referências devem ter um formato especial e comportamento,
discutiremos isso nas ‘Interações Condicionais’.
Respostas de Transações
O servidor sempre irá retornar um Bundle para permitir que cliente saiba os resultados
da transação solicitada.
Vamos enviar uma pequena transação e verificar como será a resposta do servidor e o
que significa. Com esse POST, nós vamos determinar 1) O formato e conteúdo da
resposta do servidor e 2) O que o servidor efetivamente faz com o Bundle.
Apenas recorte e cole o conteúdo no seu cliente REST e transmita essa requisição para o
servidor do seu curso de FHIR Fundamentos.
Lembre-se:
• Defina no cabeçalho da sua requisição o parâmetro para que ele entenda o formato:
Content-Type: application/fhir+xml
• As IDs dos recursos para os recursos que você irá obter serão diferentes dos recursos
apresentados neste documento.
A tela que você verá será parecida com a que é apresentada na figura abaixo:
Vamos revisar a resposta do servidor (caso já não tenha verificado você mesmo, uma
amostra de resposta do servidor está anexada como SmallTransactionAnswer.xml)
Cabeçalhos: recebemos um HTTP Status code 200 OK, então todos os resoursos/ações
foram processados OK (lembre-se que TODAS as transações ou serão bem-sucedidas ou
falharão completamente).
Corpo: Recebemos um Bundle “transaction-response”, com uma Entry pra cada Entry
que enviamos na nossa transação. A primeira Entry nos diz que o servidor criou uma
nova Organization resource (“201 Created”), com uma ID atribuída pelo servidor de
número 17449, a um novo Patient com id atribuída pelo servidor de 17450.
Vamos supor que você esteja enviando, em um mesmo Bundle, um paciente e um laudo
e o laudo tem referência para esse mesmo paciente. Como você poderá fazer referência
para um recurso que você ainda não conhece ?
Mas o criador:
• não conhece essa ID específica de paciente que os servidor atribuirá a esse paciente e
• não quer fazer mais do que uma interação com o servidor.
Observação: é claro que isso não é um problema quando o servidor permite que
diferentes clientes criem seus próprios IDs para os recursos. Esse não é sempre o caso.
Além disso, nem todos os servidores FHIR implementam identificação temporária de
recursos. No entanto, uma das duas opções estarão sempre disponíveis.
<Bundle>
<type value="transaction"/>
<entry>
<fullUrl value="urn:uuid:17C7D86E-664F-4FE2-91D7-AF9A8E47311E"/>
<resource>
<Patient>
O servidor criará novas IDs que serão apropriadas para ele, mas honrará as referências
entre recursos preservando, portanto, os relacionamentos.
Portanto, voltando para o nosso pequeno exemplo, nos geraremos uma ID temporária
para o elemento Organization, referenciaremos ela dentro do recurso Patient, para o
elemento ManagingOrganization, conforme a abaixo:
Você poderá tentar transmitir esse exemplo para o nosso servidor também. E examinar
em detalhes a resposta... Agora que você sabe como lê-la.
Vamos examinar a resposta do servidor da figura a seguir: o servidor não usou a GUID
como identificador do recurso: ele a substitui com uma nova ID gerada internamente
pelo servidor para identificar o novo recurso criado.
Interações Condicionais
Para inserções, quando o servidor processa interação, ele executa uma busca utilizando
suas estruturasde busca para o tipo de Resource, com o objetivo de encontrar uma
única id lógica para o Resource. A ção depende de quantos Resources forem
encontrados:
Essa variante funciona melhor com um PUT porque você pode condicionalmente
atualizar um recurso existente, mas buscando por um identificador de negócio ao invés
de utilizar uma id atribuída pelo servidor, com essa funcionalidade bônus: Você pode
atualizar o recurso em questão.
Dessa forma... como isso se aplica para nossa pequena transação... como podemos
garantir eu o servidor não criará pacientes e organizações repetidas toda vez que
enviamos um paciente ou organização dentro de uma transação?
O resultado ao transmitir esse Bundle é que o recurso será atualizado caso ele exista e
criado caso não encontrado. Os identificadores temporários serão substituídos pelo
atuais identificadores criados pelo servidor nas transação. Você obterá um Status HTTP
200 para cada recurso. Você poderá enviar essa transação diversas vezes e o servidor
nunca adicionará um recurso repetido. Os relacionamentos também serão mantidos.
Isso conclui nossa discussão sobre transações FHIR, mas revisaremos mais tipos de
Bundle relacionados a Mensagem, Documento e Paradigmas de Serviços de
Interoperabilidade.
Uma mensagem de requisição FHIR é uma transação FHIR com algumas regras especiais:
Não é necessário que o transporte seja RESTful sobre HTTP: Você pode enviar e
receber mensagens utilizando transferência de arquivos, compartilhamentto de pastas,
HTTP, MLLP, MQ ou qualquer outra aplicação de enfileiramento. O único requisito para
o transporte é garantir a entrega das mensagens e suas respostas.
• Consequence: a mensagem representa a mudança que ela deve realizar uma vez
executada. Esse tipo de mensagem receberá apenas uma única reposta.
• Notification: o conteúdo não é supostamente corrente e pode ser reprocessado. Esse
tipo de mensagem deve receber uma mensagem de resposta.
• Currency: a mensagem é resposta para uma consulta e deverá ser corrente. Sendo
uma consulta, esse tipo de mensagem pode receber múltiplas mensagens de resposta.
A lista de eventos (lista de tipos de mensagens, eventos, além da lista de alguns dos
Bundles para cada uma dessas mensagens) está localizada em:
http://www.hl7.org/fhir/valueset-message-events.html
© 2020 HL7® Brasil & HL7® International - Proibida Reprodução 20
A lista até o momento é bem pequena comparada com a variedade de mensagens e
eventos definidos no HL7 V2.X e V3, principalmente pelo fato da maioria das
implementações FHIR escolherem outros paradigmas (RESTful, transações, documentos
ou operações), mas está aberta para feedback.
Portanto, lembre-se:
• A transação deverá ser um Bundle do tipo value="message", com pelo menos uma
entry: MessageHeader e um ou mais entries para cada recursorequerido para o tipo de
mensagem.
• o Bundle.id é obrigatório e deve ser globalmente único.
• o MessageHeader.id é obrigatório e deverá ser globalmente único. Deverá ser usado
para associar mensagens às suas respostas.
• não há carimbo do tempo no MessageHeader, portanto deverá ser incluído um
carimbo do tempo no Bundle.timestamp (obrigatório) e representa a data/hora da
mensagem.
Em XML:
<Bundle xmlns="http://hl7.org/fhir">
<id value="a4b0eb3c-a3f3-4739-aef3-db9f718a0b15"></id>
<type value="message"> </type>
<timestamp value="2019-01-04T09:10:14Z"></timestamp>
<entry>
<resource>
<MessageHeader>
<id value="21448097-009c-4eec-b8d3-6aba818b3a74"></id>
<eventCoding>
<code value="admin-notify"></code>
</eventCoding>
<destination>
<name>RECEIVING SYSTEM</name>
<endpoint value="www.receivingsystem.com"></endpoint>
</destination>
<source>
<name>SENDING SYSTEM</name>
<endpoint value="www.sendingsystem.com"></endpoint>
</source>
<focus>
<reference value="urn:uuid:3a78d9c4-5d87-4264-b3b4-
f4d0506a373c"></reference>
</focus>
</MessageHeader>
</resource>
</entry>
<entry>
<fullUrl value="urn:uuid:3a78d9c4-5d87-4264-b3b4-f4d0506a373c"></fullUrl>
<resource>
…
© 2020 HL7® Brasil & HL7® International - Proibida Reprodução 22
</resource>
</entry>
Processamento de Mensagem
<Bundle xmlns="http://hl7.org/fhir">
<id value="0522aa28-8cf1-4b83-a452-8f7164c76d72"></id>
<type value="message"> </type>
<timestamp value="2016-10-04T09:10:14Z"></timestamp>
<entry>
<resource>
<MessageHeader>
<id value="0522aa28-8cf1-4b83-a452-8f7164c76d72"></id>
<response>
<identifier value="efdd254b-0e09-4164-883e-35cf3871715f"/>
<code value="ok"/>
</Bundle>
Isso não significa que você seja automaticamente capaz de mapear mensagens HL7 V2.x,
segmentos e campos a seus recursos FHIR equivalentes. Não há um projeto HL7 que
atualmente faça isso, mas alguns projetos já tentaram cobrir no mínimo requisitos
básicos do HL7 V2.X (ADT, ORU, ORM, etc.).
Se você pegar este arquivo para testar, experimente um POST para um servidor FHIR.
Poucos servidores de teste FHIR dão suporte a este paradigma de mensageria, devido a
preferência de mercado por REST e Documentos.
Você poderá verificá-lo neste vídeo de Rene Spronk, da Holanda, na sua apresentação
no DevDays 2018 “Messaging, The Unloved Paradigm”, here:
https://www.youtube.com/watch?v=_ov5bYIRTpg
Há seis características definidas para Documentos Clínicos pelo HL7 CDA R2:
persistência, administrabilidade (stewardship), potencial para autenticação, contexto,
completude, e legibilidade humana.
Finalmente, documentos FHIR podem ser processados de maneiras que não aderem às
seis características de documentos CDA (por exemplo, você pode simplesmente
processar os recursos de um CDA sem armazenar o documento como um todo
conforme transmitido pelo seu criador).
Isso não impede que projetos específicos sejam baseados em documentos FHIR
enquanto preservando as 6 características de um documento clínico.
O Bundle.type deve ser do tipo “document”. O documento deverá incluir uma lista de
Entries. Para documentos, a primeira Entry deverá ser uma Composition, e alguns
outros recursos são OBRIGATÓRIOS, seja no Bundle (recomendado para a completude)
ou externamente referenciados na Composition.
Portanto, lembre-se:
1. A transação deverá ser Bundle do tipo value="document", com pelo menos uma
Entry: Composition de uma ou mais Entries para cada referência interna (algumas são
obrigatórias). Essa é uma receita mínima, portanto listaremos apenas os elementos
Novamente, se você quer experimentar esse documento no seu servidor FHIR, você
precisará transmitir esse Bundle para o endpoint de Bundles, já que nem todos os
servidores permitem processamento de elementos Composition.
http://fhir.hl7fundamentals.org/r4/Bundle
Isso é feito através da inclusão da referência de uma folha de estilo ao Bundle. A URI
pode ser referenciada a um arquivo provisionado em um servidor web qualquer, ou
referenciado a um recurso incluído nesse mesmo Bundle.
<Bundle xmlns="http://hl7.org/fhir">
<link>
<relation value="stylesheet"/>
<url value="[uri]"/>
…
</Bundle>
• CDA ON FHIR: Projeto que define como documentos clínicos devem aparecer em FHIR.
Incluindo: perfis do recurso Composition (veremos perfis na próxima semana),
mapeamento de cabeçalho CDA (CDA header) na Composition e mapeamento alto nível
de root Entries para recursos correspondentes em FHIR.
https://www.hl7.org/fhir/cda-intro.html
• C-CDA ON FHIR: Projeto de mapeamento do CCDA e seu FHIR equivalente, incluindo
Profiles. Visão de longo prazo é uma nova versão de CCDA com equivalentes FHIR exatos
feitos em paralelo.
http://wiki.hl7.org/index.php?title=C-CDA_on_FHIR
• Para um comparativo completo entre CDA R2 e FHIR, acesse:
https://www.hl7.org/fhir/comparison-cda.html
• Named operations são executadas com entradas (inputs) e saídas (outputs) (Execute).
• Operações são utilizadas quando:
1. o servidor precisa exercer um papel ativo na formulação do conteúdo de
resposta.
2. o propósito é causar efeitos colaterais como a modifcação de recursos
existentes, ou criação de novos recursos.
• O FHIR define um conjunto de operações simples em um framework que, de forma
desacoplada, estende a RESTFul API, da seguinte maneira:
1. Toda operação tem um nome
2. Cada operação tem uma lista de parâmetros de entrada (in) e parâmetros de
saída (out)
3. Parâmetros podem ser Resources, Data types ou Search Parameters
4. Operações podem estar sujeitas às mesmas restrições de segurança e
requisito da RESTFul API
5. A URI do endpoint da operação pode ser baseada no esquema de endereços
da RESTFul API vigente
6. Operações podem fazer uso usar o repositório de Resources e definições
7. Operações podem ser realizadas em um Resource específico, Resource Type
ou sistema como um todo
Executando Operações
Parâmetros de operação
Resposta da Operação
Duas operações importantes que usaremos são $everything (se aplica a um paciente
específico) e $validate (valida um recurso com base na definição de recurso e / ou em
um perfil específico. Veremos perfis na próxima unidade)
Orientação geral
Não há absolutos. Esta seção é apenas para orientação. Sua escolha talvez seja
influenciada pela preferência e pelo legado, e talvez por outras considerações não
técnicas. Não se limite a apenas uma opção: misture e combine para atender aos seus
cenários, casos de uso e parceiros de comunicação.
Vamos tentar resumir em uma página o que você aprendeu, caso alguém pergunte no
elevador o que você aprendeu esta semana.
Existem vários lugares onde você pode obter informações sobre o FHIR.