Простой пример клиента Fhir на java


1. Fhir-client-java

Это простой fhir-клиент на java для тренировки работы с fhir-ресурсами и CRUD-запросами к fhir-серверу.

Обратите внимание, что по большей части активировано автозавершение.

GitHub

  • 1. Fhir-client-java
  • 2. Предварительные условия
  • 3. Установка
    • 3.1. Установка для разработки
    • 3.2. Портал управления и VSCode
    • 3.3. Открытие папки внутри контейнера
  • 4. Сервер FHIR
  • 5. Прохождение
    • 5.1. Часть 1
    • 5.2. Часть 2
    • 5.3. Часть 3
    • 5.4. Часть 4
    • 5.5. Завершение прохождения
  • 6. Как начать кодирование
  • 7. Что находится внутри репозитория
    • 7.1. Dockerfile
    • 7.2. .vscode/settings.json
    • 7.3. .vscode/launch.json

2. Предварительные условия

Убедитесь, что у вас установлены git и Docker desktop.

Уже установленные в контейнере :

Hapi Fhir модель и клиент

3. Установка

3.1. Установка для разработки

Клонируйте/гитируйте репозиторий в любую локальную директорию, например, как показано ниже:

git clone https://github.com/LucasEnard/fhir-client-java.git
Войдите в полноэкранный режим Выйти из полноэкранного режима

Откройте терминал в этой директории и запустите:

docker build .
Enter fullscreen mode Выйти из полноэкранного режима

3.2. Портал управления и VSCode

Этот репозиторий готов для VS Code.

Откройте локально клонированную папку fhir-client-java в VS Code.

Если появится запрос (правый нижний угол), установите рекомендуемые расширения.

3.3. Открытая папка внутри контейнера

При желании вы можете находиться внутри контейнера до начала кодирования.

Для этого перед открытием VSCode должен быть включен docker.

Затем, внутри VSCode, когда появится запрос (в правом нижнем углу), снова откройте папку внутри контейнера, чтобы вы могли использовать компоненты python внутри нее.

В первый раз это может занять несколько минут, пока контейнер будет подготовлен.

Если у вас нет такой возможности, вы можете щелкнуть в левом нижнем углу и нажать reopen in container, затем выбрать From Dockerfile.

Дополнительная информация здесь

Открыв папку remote, вы позволите VS Code и любым терминалам, которые вы откроете в ней, использовать компоненты java в контейнере.

4. Сервер FHIR

Для завершения этого прохода вам понадобится сервер FHIR.

Вы можете либо использовать свой собственный, либо обратиться к бесплатной пробной версии FHIR от InterSystems и выполнить следующие несколько шагов по его настройке.

Используя нашу бесплатную пробную версию, просто создайте учетную запись и начните развертывание, затем на вкладке Overview вы получите доступ к конечной точке типа https://fhir.000000000.static-test-account.isccloud.io, которую мы будем использовать позже.

Затем, перейдя на вкладку Credentials, создайте api ключ и сохраните его где-нибудь.

Теперь все готово, у вас есть собственный fhir-сервер, вмещающий до 20 ГБ данных с памятью 8 ГБ.

5. Прохождение

Полное описание клиента находится по адресу src/java/test/Client.java.

Код разделен на несколько частей, и ниже мы рассмотрим каждую из них.

5.1. Часть 1

В этой части мы подключаем наш клиент к нашему серверу с помощью Fhir.Rest.


// Part 1

      // Create a context usign FHIR R4
      FhirContext ctx = FhirContext.forR4();

      // create an header containing the api key for the httpClient
      Header header = new BasicHeader("x-api-key", "api-key");
      ArrayList<Header> headers = new ArrayList<Header>();
      headers.add(header);

      // create an httpClient builder and add the header to it
      HttpClientBuilder builder = HttpClientBuilder.create();
      builder.setDefaultHeaders(headers);

      // create an httpClient using the builder
      CloseableHttpClient httpClient = builder.build();

      // Set the httpClient to the context using the factory
      ctx.getRestfulClientFactory().setHttpClient(httpClient);

      // Create a client
      IGenericClient client = ctx.newRestfulGenericClient("url");

Вход в полноэкранный режим Выход из полноэкранного режима

Для подключения к серверу необходимо изменить строку :

Header header = new BasicHeader("x-api-key", "api-key");
Enter fullscreen mode Выйти из полноэкранного режима

И эту строку :

IGenericClient client = ctx.newRestfulGenericClient("url");
Enter fullscreen mode Выйти из полноэкранного режима

'url' — это конечная точка, а 'api-key' — это api-ключ для доступа к вашему серверу.

Обратите внимание, что если вы не используете сервер InterSystems, вы можете проверить, как авторизовать ваши акцессы, если это необходимо.

Вот так, у нас есть FHIR-клиент, способный напрямую обмениваться данными с нашим сервером.

5.2. Часть 2

В этой части мы создаем пациента с помощью Fhir.Model и заполняем его именем человека (HumanName), следуя конвенции FHIR, use и family являются строками, а given — это список строк. Таким же образом у пациента может быть несколько имен людей, поэтому мы должны поместить наше имя человека в список, прежде чем поместить его во вновь созданного пациента.


// Part 2

      // Create a patient and add a name to it
      Patient patient = new Patient();
      patient.addName()
         .setFamily("FamilyName")
         .addGiven("GivenName1")
         .addGiven("GivenName2");

      // See also patient.setGender or setBirthDateElement

      // Create the resource patient on the server
        MethodOutcome outcome = client.create()
         .resource(patient)
         .execute();

      // Log the ID that the server assigned
      IIdType id = outcome.getId();
      System.out.println("");
      System.out.println("Created patient, got ID: " + id);
      System.out.println("");
Вход в полноэкранный режим Выход из полноэкранного режима

После этого нам нужно сохранить нашего нового Пациента на нашем сервере с помощью нашего клиента.

Обратите внимание, что если вы запустите Client.java несколько раз, будет создано несколько Пациентов с выбранным нами именем.
Это происходит потому, что, следуя конвенции FHIR, вы можете иметь несколько Пациентов с одинаковым именем, только id является уникальным на сервере.

Более подробную информацию можно найти в документации.

Поэтому мы советуем закомментировать строку после первого запуска.

5.3. Часть 3

В этой части мы получим клиента, который ищет Пациента, названного так же, как и созданный нами ранее.

// Part 3

      // Search for a single patient with the exact family name "FamilyName" and the exact given name "GivenName1"
      patient = (Patient) client.search()
         .forResource(Patient.class)
         .where(Patient.FAMILY.matchesExactly().value("FamilyName"))
         .and(Patient.GIVEN.matchesExactly().value("GivenName1"))
         .returnBundle(Bundle.class)
         .execute()
         .getEntryFirstRep()
         .getResource();

      // Create a telecom for patient
      patient.addTelecom()
         .setSystem(ContactPointSystem.PHONE)
         .setUse(ContactPointUse.HOME)
         .setValue("555-555-5555");

      // Change the patient given name to another
      patient.getName().get(0).getGiven().set(0,  new StringType("AnotherGivenName"));

      // Update the resource patient on the server
      MethodOutcome outcome2 = client.update()
         .resource(patient)
         .execute();
Вход в полноэкранный режим Выход из полноэкранного режима

Как только мы нашли его, мы добавляем номер телефона в его профиль и меняем его имя на другое.

Теперь мы можем использовать функцию обновления нашего клиента для обновления нашего пациента на сервере.

5.4. Часть 4

В этой части мы хотим создать наблюдение для нашего предыдущего пациента, для этого нам нужен его id, который является его уникальным идентификатором.

Отсюда мы заполняем наше наблюдение и добавляем в качестве субъекта идентификатор нашего пациента.

// Part 4

      // Create a CodeableConcept and fill it
      CodeableConcept codeableConcept = new CodeableConcept();
      codeableConcept.addCoding()
         .setSystem("http://snomed.info/sct")
         .setCode("1234")
         .setDisplay("CodeableConceptDisplay");

      // Create a Quantity and fill it
      Quantity quantity = new Quantity();
      quantity.setValue(1.0);
      quantity.setUnit("kg");

      // Create a Category and fill it
      CodeableConcept category = new CodeableConcept();
      category.addCoding()
         .setSystem("http://snomed.info/sct")
         .setCode("1234")
         .setDisplay("CategoryDisplay");

      // Create a list of CodeableConcepts and put category into it
      ArrayList<CodeableConcept> codeableConcepts = new ArrayList<CodeableConcept>();
      codeableConcepts.add(category);

      // Create an Observation
      Observation observation = new Observation();
      observation.setStatus(Observation.ObservationStatus.FINAL);
      observation.setCode(codeableConcept);
      observation.setSubject(new Reference().setReference("Patient/" + ((IIdType) outcome2.getId()).getIdPart()));
      observation.setCategory(codeableConcepts);
      observation.setValue(quantity);

      System.out.println("");
      System.out.println("Created observation, reference : " + observation.getSubject().getReference());
      System.out.println("");

       // Create the resource observation on the server
      MethodOutcome outcome3 = client.create()
         .resource(observation)
         .execute();

      // Print the response of the server
      System.out.println("");
      System.out.println("Created observation, got ID: " + outcome3.getId());
      System.out.println("");
Вход в полноэкранный режим Выход из полноэкранного режима

Затем мы регистрируем наше наблюдение с помощью функции create.

5.5. Заключение

Если вы следовали этому описанию, вы теперь точно знаете, что делает Client.java, вы можете запустить его и проверить на своем сервере только что созданных пациента и наблюдение.

Чтобы запустить его, откройте терминал VSCode и введите :

dotnet run
Войти в полноэкранный режим Выйти из полноэкранного режима

Вы должны увидеть некоторую информацию о созданном нами Пациенте и его наблюдении.

Если вы используете сервер Intersystems, перейдите в API Deployement, авторизуйтесь с помощью api ключа и отсюда вы можете ПОЛУЧИТЬ по id пациента и наблюдения, которые мы только что создали.

6. Как начать кодирование

Этот репозиторий готов к кодированию в VSCode с плагинами InterSystems.
Откройте Client.java, чтобы начать кодировать или использовать автодополнение.

7. Что находится внутри репозитория

7.1. Dockerfile

Dockerfile для создания dot net env для работы.

Используйте docker build . для сборки и повторного открытия вашего файла в контейнере для работы внутри него.

7.2. .vscode/settings.json

Файл настроек.

7.3. .vscode/launch.json

Конфигурационный файл, если вы хотите отлаживать

Оцените статью
Procodings.ru
Добавить комментарий