Поиск ресурса в пакете по ссылке с помощью пакета Nuget FHIR

Я использую пакет FHIR и пытаюсь разрешить ссылки на ресурсы в этом пакете, используя пакет nuget.net FHIR R4. Я использую эту информацию для справки.

Как разрешить ссылку в Bundle:

  • Если ссылка не является абсолютной ссылкой, преобразуйте ее в абсолютный URL:
    • если ссылка имеет формат [тип]/[идентификатор], и
    • если fullUrl для записи пакета, содержащей ресурс, является RESTful (см. регулярное выражение URL RESTful)
      • извлеките [root] из fullUrl и добавьте к нему ссылку (type / id)
      • затем попробуйте разрешить в пакете, как для ссылки URL-адреса RESTful.
      • Если разрешение невозможно, то ссылка не имеет определенного значения в данной спецификации.
    • иначе разрешение невозможно, и ссылка не имеет определенного значения в этой спецификации
  • еще
    • Найдите запись с полным Url, которая соответствует URI в ссылке
    • если совпадение не найдено, а URI - это URL-адрес, который может быть разрешен (например, если URL-адрес http:), попробуйте получить к нему доступ напрямую)

Кроме того, обратите внимание, что ссылка может быть по идентификатору, и если он есть, а URL-адрес отсутствует, это может быть разрешено путем сканирования идентификаторов в пакете. Также обратите внимание, что транзакции могут содержать условные ссылки, которые должны быть разрешены сервером перед обработкой совпадений.

Если ссылка является конкретной версией (относительной или абсолютной), удалите версию из URL-адреса до сопоставления fullUrl, а затем сопоставьте версию на основе Resource.meta.versionId. Обратите внимание, что правила разрешения ссылок в содержащихся ресурсах такие же, как и правила для разрешения ресурсов в ресурсе, который содержит вложенный ресурс.

Если найдено несколько совпадений, это неясно. Приложения МОГУТ возвращать ошибку или предпринимать другие действия по своему усмотрению.

Метод расширения Bundle.FindEntry работает только с абсолютными ссылками, такими как этот...

<entry>
    <fullUrl value="http://example.org/fhir/Observation/124"/>
    <resource>
        <Observation>
            <id value="124"/>

            <subject>
                <!--    this is reference to the first patient above    -->
                <reference value="http://example.org/fhir/Patient/23"/>
            </subject>
        </Observation>
    </resource>
</entry> 

... но выдает исключение, если ссылка не является абсолютной, например:

<entry>
    <fullUrl value="http://example.org/fhir/Observation/123"/>
    <resource>
        <Observation>
            <id value="123"/>

            <subject>
                <!--    this is reference to the first patient above    -->
                <reference value="Patient/23"/>
            </subject>
        </Observation>
    </resource>
</entry>

Есть ли какие-либо функции, которые могут разрешать относительные ссылки? Если что-то уже не предоставлено, как мне написать собственное?

  • Как преобразовать относительный URL-адрес в абсолютный, как указано в спецификации?
  • Какова будет логика извлечения корня из FullUrl EntryComponent для разрешения? Как узнать, что такое корень?
  • Как я узнаю, что ссылка идет по идентификатору? это выглядит как относительная ссылка.

1 ответ

Решение

Функциональность для этого уже есть в библиотеке.Net FHIR в виде методов расширения в ResourceReference. В вашем примере может работать что-то вроде этого:

    ResourceReference r1 = ((Observation)b.Entry[0].Resource).Subject;
    var abs = r1.GetAbsoluteUriForReference(b.Entry[0].FullUrl);

Это берет (относительную) ссылку из поля темы в исходном ресурсе и использует fullUrl исходной записи для объединения конечной точки / корня в этом с относительной ссылкой.

Корневая / базовая / конечная точка всегда будет частью абсолютного URL-адреса до типа ресурса, но, поскольку это иногда трудно определить, библиотека предлагает вам ResourceIdentityфункциональность для создания ссылок или просмотра определенных их частей. См. Множество примеров в модульных тестах ResourceIdentity.

Если ссылка по идентификатору, будет заполнен.Identifier ResourceReference. Или, если это условная ссылка, будет заполнен.Query ResourceIdentity.

Другие вопросы по тегам