Поиск ресурса в пакете по ссылке с помощью пакета FHIR nuget - PullRequest
0 голосов
/ 11 октября 2019

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

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

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

Кроме того, обратите внимание, что ссылка может быть по идентификатору, и, если она есть, а 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 Ответ

0 голосов
/ 11 октября 2019

Для этого уже есть функциональность в библиотеке .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. Или, если это условная ссылка,. Запрос ResourceIdentity будет заполнен.

...