Поиск ресурса в пакете по ссылке с помощью пакета 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.