Tutorial Como construir paso a paso un Cliente FHIR en C# Punto NET


El Objetivo de este tutorial es mostrar paso a paso como construir un cliente FHIR en C#, 
Los requisitos para este tutorial son simplemente estar familiarizado con la programación C# :NET y tener conocimientos básicos de lo que es REST, JSON,XML FHIR y HL7.

Introducción

¿Qué es FHIR?
FHIR son las siglas de Fast Healthcare Interoperability Resources (pronunciado como fire) y se trata del último estándar desarrollado y promovido por la organización internacional HL7 (Health Level Seven)

¿Qué es un servidor FHIR?
Un Servidor FHIR RESTful  es un proveedor de recursos FHIR. Estos recursos pueden ser consumidos desde aplicaciones clientes. Los recursos se basan en estructuras XML o JSON que utilizan un protocolo REST basado en http (en contraposición a los servicios basados en SOAP que se pueden encontrar en la mayoría de perfiles IHE).
Los recursos mas comunes que podemos consumir son:
Patient, Practitioner, Organization, una lista de recursos FHIR y mas detalle sobre los mismos puede optener de https://www.hl7.org/fhir/resource.html

¿Qué es un cliente FHIR?
Un cliente FHIR es una Aplicación que tiene la capacidad de conectarse y consumir recursos FHIR de un servidor. Los recursos FHIR son básicamente recursos REST estandarizados dentro de las normas FHIR.

¿Que vamos a hacer?
Vamos a crear un proyecto  de un cliente FHIR que mande un requerimiento http GET de un recurso Patient a un servidor FHIR en forma sincrónica para que este devuelva una respuesta JSON que nosotros podamos mostrar.



Comencemos a crear el proyecto
Abrimos el Visual Studio y vamos a nuevo proyecto


Seleccionamos contruir un proyecto winform, ponemos el nombre a nuestro poryecto


En este caso lo llamaremos ClienteFHIR, configuramos el directorio en donde lo queremos guardar y presionamos el boton continuar.


En el formulario prinicipal ponemos los siguentes controles
En el formulario creamos los siguientes controles
2 campos de textos que llamaremos
txtRequestURI
txtRespuesta
un combo cboVerbos
y un boton que llamaremos
btnIr
Les ponemos etiquetas para recordar que son y a la respuesta le ponemos la propuedad multilinea true y  la barra de scroll lateral ya que pude ser larga y tenemos que tener espacio para poder verla.



En el formulario creamos una rutina para generar multilineas en el text box de respuesta

        /// <summary>
        /// RUTINA PARA GENERAR MULTIPLES LINEAS EN UN TEXTBOX
        /// </summary>
        /// <param name="strDebugText"></param>
        private void debugOutput(string strDebugText)
        {
            try
            {
                System.Diagnostics.Debug.Write(strDebugText + Environment.NewLine;
                txtRespuesta.Text = txtRespuesta.Text + strDebugText + Environment.NewLine);
                txtRespuesta.SelectionStart = txtRespuesta.TextLength;
                txtRespuesta.ScrollToCaret();
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.Write(ex.Message, ToString() + Environment.NewLine);
            }
        }


Luego agregamos una clase que vamos a llamar RestClass
Vamos a crear dos endpoint class properties



En el siguiente link
tenemos información  y documentación online sobre la clase httpWebRequest 



El Diagrama de la Clase es el siguiente

El contenido de la clase será:


using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;            // Es necesario que este
using System.Net;           // Es necesario que este
using System.Text;          // Es necesario que este
using System.Threading.Tasks;
using System.Net.Http.Headers;
using System.Net.Http;

namespace ClienteFHIR
{

    public enum Httpverb

    {
        GET= 1,
        POST =2,
        PUT=3,
        DELETE=4
    }



    class RESTClient
    {
        public string endPoint { get; set; }
        public httpVerb HttpMethod { get; set; }
        public Httpverb Verbo { get; set; }
        //Default Constructor
        public RESTClient()
        {
            endPoint = "";
            //HttpMethod = httpVerb.GET;
        }

        public string makeRequest()
        {
            string strResponseValue = string.Empty;

            var request = (HttpWebRequest)WebRequest.Create(endPoint);

           // request.Method = HttpMethod.ToString();
            request.Method = Verbo.ToString();
            HttpWebResponse response = null;

            try
            {
                response = (HttpWebResponse)request.GetResponse();


                //Proecess the resppnse stream... (could be JSON, XML or HTML etc..._

                using (Stream responseStream = response.GetResponseStream())
                {
                    if (responseStream != null)
                    {
                        using (StreamReader reader = new StreamReader(responseStream))
                        {
                            strResponseValue = reader.ReadToEnd();
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                //We catch non Http 200 responses here.
                strResponseValue = "{\"errorMessages\":[\"" + ex.Message.ToString() + "\"],\"errors\":{}}";
            }
            finally
            {
                if (response != null)
                {
                    ((IDisposable)response).Dispose();
                }
            }

            return strResponseValue;

        }


    }
    }


Detras del boton ir colocamos el siguiente código:

 private void btnIr_Click(object sender, EventArgs e)
        {

            RESTClient rClient = new RESTClient();

            //string verbo = cboVerbos.SelectedText.ToString();
            Httpverb verbo;
            Enum.TryParse(cboVerbos.SelectedValue.ToString(), out verbo);
            rClient.endPoint = txtRequestURI.Text;
            rClient.Verbo = verbo;
            debugOutput("RESTClient Object created.");

            string strJSON = string.Empty;

            strJSON = rClient.makeRequest();

            debugOutput(strJSON);


        }

Luego de inicializar el módulo cargamos el combo con los métodos

        public Form1()
        {
            InitializeComponent();
         
            cboVerbos.DataSource = Enum.GetValues(typeof(Httpverb));
        }


¿Cóno consultamos?
Para probar nuestro cliente FHIR vamos a usar un servidor de prueba  "fhir.hl7fundamentals.org" donde previamente cargamos un paciente
en el textbox de la url escribimos lo siguente:
http://fhir.hl7fundamentals.org/baseDstu3/Patient/40562

y en la ventana de respuesta, si todo va bien optenemos un JSON con los siguientes datos

{
   "resourceType": "Patient",
   "id": "40562",
   "meta": {
      "versionId": "3",
      "lastUpdated": "2018-04-22T07:21:33.000-04:00"
   },
   "text": {
      "status": "generated",
      "div": "<div xmlns=\"http://www.w3.org/1999/xhtml\"><div class=\"hapiHeaderText\">
Humberto Fernn <b>MANDIROLA </b></div><table class=\"hapiPropertyTable\"><tbody>
<tr><td>Address</td><td><span>Balcarce 50 </span><br/><span>Buenos Aires </span>
<span>CABA </span></td></tr><tr><td>Date of birth</td><td><span>16 November 1966</span>
</td></tr></tbody></table></div>"
   },
   "name": [
      {
         "family": "Mandirola",
         "given": [
            "Humberto",
            "Fernán"
         ]
      }
   ],
   "gender": "male",
   "birthDate": "1966-11-16",
   "address": [
      {
         "line": [
            "Balcarce 50"
         ],
         "city": "Buenos Aires",
         "state": "CABA",
         "postalCode": "3999"
      }
   ]
}

Espero que les haya sido de utilidad y cualquier duda o inquietud sobre este tutorial estoy a sus órdenes.. Estamos armando un video sobre el mismo cuando este listo les avisamos.



Referencias
https://github.com/ewoutkramer/fhir-net-api
https://www.youtube.com/watch?v=11f5KzVNQ90
https://www.youtube.com/watch?v=nvipUO71-wQ
https://hablandoesalud.wordpress.com/2015/03/23/que-es-fhir-y-por-que-deberia-preocuparme/
http://hl7es.blogspot.com/2013/12/fhir-el-nuevo-miembro-de-la-familia-hl7.html
https://www.hl7.org/fhir/overview.html
https://www.hl7.org/fhir/resource.html
https://msdn.microsoft.com/en-us/library/system.net.httpwebrequest(v=vs.110).aspx
https://binarythistleblog.wordpress.com/
https://binarythistleblog.wordpress.com/2016/09/30/consuming-a-rest-api-from-c/

Comentarios

Entradas más populares de este blog

ESCANEO DEL CODIGO PDF417 DEL DNI (Documento Nacional de Identidad digital)

¿Que tipos de Mensajes de HL7 hay?

¿Que es Razor?