Capacidades da API REST FHIR para a API do Azure para FHIR
Neste artigo, vamos abordar algumas das nuances das interações RESTful da API do Azure para FHIR.
Criação/atualização condicional
A API do Azure para FHIR suporta a criação, criação condicional, atualização e atualização condicional, conforme definido pela especificação FHIR. Um cabeçalho útil nestes cenários é o cabeçalho If-Match . O If-Match
cabeçalho é utilizado e validará a versão que está a ser atualizada antes de efetuar a atualização. Se o ETag
não corresponder ao esperado ETag
, produzirá a mensagem de erro 412 Falha na Pré-condição.
Eliminar e Eliminar Condicional
A API do Azure para FHIR oferece dois tipos de eliminação. Existe a opção Eliminar, que também é conhecido como Hard + Soft Delete e Conditional Delete.
Eliminar (Hard + Soft Delete)
A eliminação definida pela especificação FHIR requer que, após eliminar um recurso, as leituras específicas subsequentes não relacionadas com a versão de um recurso devolvam um código de estado HTTP 410. Por conseguinte, o recurso já não é encontrado através da pesquisa. Além disso, a API do Azure para FHIR permite-lhe eliminar totalmente (incluindo todo o histórico) do recurso. Para eliminar totalmente o recurso, pode transmitir as definições de parâmetros hardDelete
para true (DELETE {{FHIR_URL}}/{resource}/{id}?hardDelete=true)
. Se não transmitir este parâmetro ou definir hardDelete
como falso, as versões históricas do recurso continuarão disponíveis.
Nota
Se apenas quiser eliminar o histórico, a API do Azure para FHIR suporta uma operação personalizada chamada $purge-history
. Esta operação permite-lhe eliminar o histórico de um recurso.
Eliminação Condicional
A Eliminação Condicional permite-lhe transmitir critérios de pesquisa para eliminar um recurso. Por predefinição, a Eliminação Condicional permite-lhe eliminar um item de cada vez. Também pode especificar o _count
parâmetro para eliminar até 100 itens de cada vez. Seguem-se alguns exemplos de utilização da Eliminação Condicional.
Para eliminar um único item com a Eliminação Condicional, tem de especificar critérios de pesquisa que devolvem um único item.
DELETE https://{{FHIR_URL}}/Patient?identifier=1032704
Pode fazer a mesma pesquisa, mas incluir hardDelete=true
também para eliminar todo o histórico.
DELETE https://{{FHIR_URL}}/Patient?identifier=1032704&hardDelete=true
Para eliminar vários recursos, inclua o _count=100
parâmetro . Este parâmetro eliminará até 100 recursos que correspondam aos critérios de pesquisa.
DELETE https://{{FHIR_URL}}/Patient?identifier=1032704&_count=100
Recuperação de ficheiros eliminados
Se não utilizar o parâmetro de eliminação dura, os registos na API do Azure para FHIR ainda deverão existir. Os registos podem ser encontrados ao fazer uma pesquisa de histórico no recurso e à procura da última versão com dados.
Se o ID do recurso que foi eliminado for conhecido, utilize o seguinte padrão de URL:
<FHIR_URL>/<resource-type>/<resource-id>/_history
Por exemplo: https://myworkspace-myfhirserver.fhir.azurehealthcareapis.com/Patient/123456789/_history
Se o ID do recurso não for conhecido, efetue uma pesquisa de histórico em todo o tipo de recurso:
<FHIR_URL>/<resource-type>/_history
Por exemplo: https://myworkspace-myfhirserver.fhir.azurehealthcareapis.com/Patient/_history
Depois de encontrar o registo que pretende restaurar, utilize a PUT
operação para recriar o recurso com o mesmo ID ou utilize a POST
operação para criar um novo recurso com as mesmas informações.
Nota
Não existe expiração baseada no tempo para dados de histórico/eliminação recuperável. A única forma de remover dados de histórico/eliminação recuperável é com uma eliminação rápida ou a operação do histórico de remoção.
Patch e Patch Condicional
Patch é uma operação RESTful valiosa quando precisa de atualizar apenas uma parte do recurso FHIR. A utilização de patch permite-lhe especificar os elementos que pretende atualizar no recurso sem ter de atualizar todo o registo. O FHIR define três formas de Corrigir recursos: Patch JSON, Patch XML e FHIRPath Patch. O Serviço FHIR suporta patch JSON e FHIRPath Patch juntamente com Patch JSON Condicional e Patch FHIRPath Condicional (que lhe permite Corrigir um recurso com base em critérios de pesquisa em vez de um ID de recurso). Para ver alguns exemplos, veja o ficheiro REST de Patch FHIRPath de exemplo e o ficheiro REST de Patch JSON para cada abordagem. Para obter detalhes adicionais, leia a documentação do HL7 para operações de patch com fHIR.
Nota
Ao utilizar PATCH
o STU3 e, se estiver a pedir um pacote Histórico, o recurso Bundle.entry.request.method
corrigido é mapeado para PUT
. Isto deve-se ao facto de o STU3 não conter uma definição para o PATCH
verbo no conjunto de valores HTTPVerb.
Patch com FHIRPath Patch
Este método de patch é o mais poderoso, uma vez que tira partido do FHIRPath para selecionar o elemento a atingir. Um cenário comum é utilizar o Patch FHIRPath para atualizar um elemento numa lista sem saber a ordem da lista. Por exemplo, se quiser eliminar as informações de telecomunicações domésticas de um paciente sem conhecer o índice, pode utilizar o exemplo abaixo.
PATCH http://{FHIR-SERVICE-HOST-NAME}/Patient/{PatientID}
Tipo de conteúdo: application/fhir+json
{
"resourceType": "Parameters",
"parameter": [
{
"name": "operation",
"part": [
{
"name": "type",
"valueCode": "delete"
},
{
"name": "path",
"valueString": "Patient.telecom.where(use = 'home')"
}
]
}
]
}
Todas as operações de Patch FHIRPath têm de ter o application/fhir+json
cabeçalho Tipo de Conteúdo definido. O Patch FHIRPatch suporta operações de adicionar, inserir, eliminar, remover e mover. As operações de Patch FHIRPatch também podem ser facilmente integradas em Pacotes. Para obter mais exemplos, veja o ficheiro REST do Patch FHIRPath de exemplo.
Patch com Patch JSON
O Patch JSON no Serviço FHIR está em conformidade com a especificação bem utilizada definida pela Força-Tarefa de Engenharia da Internet. O formato payload não utiliza recursos FHIR e, em vez disso, utiliza um documento JSON que tira partido JSON-Pointers para a seleção de elementos. O Patch JSON é mais compacto e tem uma operação de teste que lhe permite validar que uma condição é verdadeira antes de efetuar o patch. Por exemplo, se quiser definir um paciente como falecido apenas se ainda não estiver marcado como falecido, pode utilizar o exemplo abaixo.
PATCH http://{FHIR-SERVICE-HOST-NAME}/Patient/{PatientID}
Tipo de conteúdo: application/json-patch+json
[
{
"op": "test",
"path": "/deceasedBoolean",
"value": false
},
{
"op": "replace",
"path": "/deceasedBoolean",
"value": true
}
]
Todas as operações de Patch JSON têm de ter o application/json-patch+json
cabeçalho Tipo de Conteúdo definido. O Patch JSON suporta operações de adicionar, remover, substituir, copiar, mover e testar. Para obter mais exemplos, veja o ficheiro REST de Patch JSON de exemplo.
Patch JSON em Pacotes
Por predefinição, o Patch JSON não é suportado nos recursos do Pacote. Isto acontece porque um Pacote só suporta recursos FHIR e o payload de Patch JSON não é um recurso FHIR. Para resolver este problema, vamos utilizar recursos binários com um Tipo de "application/json-patch+json"
Conteúdo e a codificação base64 do payload JSON dentro de um Pacote. Para obter informações sobre esta solução, veja este tópico no Zulip de Chat FHIR.
No exemplo abaixo, queremos mudar o sexo do paciente para feminino. Tomámos o patch [{"op":"replace","path":"/gender","value":"female"}]
JSON e codificamo-lo para base64.
POST https://{FHIR-SERVICE-HOST-NAME}/
Tipo de Conteúdo: application/json
{
"resourceType": "Bundle",
"id": "bundle-batch",
"type": "batch",
"entry": [
{
"fullUrl": "Patient/{PatientID}",
"resource": {
"resourceType": "Binary",
"contentType": "application/json-patch+json",
"data": "W3sib3AiOiJyZXBsYWNlIiwicGF0aCI6Ii9nZW5kZXIiLCJ2YWx1ZSI6ImZlbWFsZSJ9XQ=="
},
"request": {
"method": "PATCH",
"url": "Patient/{PatientID}"
}
}
]
}
Passos seguintes
Neste artigo, ficou a conhecer algumas das capacidades REST da API do Azure para FHIR. Em seguida, pode saber mais sobre os principais aspetos da pesquisa de recursos no FHIR.
(FHIR®) é uma marca registada do HL7 e é utilizada com a permissão de HL7.