.Net 中具有高级搜索和修饰符的 HL7 FHIR 路由

Posted

技术标签:

【中文标题】.Net 中具有高级搜索和修饰符的 HL7 FHIR 路由【英文标题】:HL7 FHIR routing with advanced search and modifiers in .Net 【发布时间】:2016-07-29 17:37:22 【问题描述】:

我目前正在尝试使用 FHIR 搜索来解决路由问题。

在网页https://www.hl7.org/fhir/search.html 的第2.1.1.48 段字符串中,有一节介绍了如何使用修饰符返回包含或匹配提供的参数值的结果。

例如:

[base]/Patient?name=eve
[base]/Patient?name:contains=eve    
[base]/Patient?name:exact=Eve

我从未见过 f.ex 接受带有这些自定义修饰符“?name:exact/contains”的此类 URL。开箱即用的 Web api 服务。

据我所知,在

的行里是不允许写东西的
[Route("type/name:contains/name")] 
public HttpResponseMessage GetContainsName(string name)

//do something 


[Route("type/name:exact/name")]
public HttpResponseMessage GetExactName(string name) 
//do something else

【问题讨论】:

请看这个问题:***.com/questions/2053132/… 【参考方案1】:

这是启动并运行 FHIR 服务器的一种可能解决方案。我使用了 Sparks.Engine 中的一些代码,因此更容易让修饰符工作以及“解码”url。

希望你在这两种方法中都能获得成功

这些方法应该接受这样的网址

fhir/Patient/1
fhir/Patient?name=something
fhir/?_query="nameOfQuery"&name:contains="someName"

服务器本身的代码如下所示

namespace FHIRServer.Controllers

    [RoutePrefix("fhir"), EnableCors("*", "*", "*", "*")]
    [RouteDataValuesOnly]
    public class FhirController : ApiController
    
        public FhirController()
        
        

        [HttpGet, Route("type")]
        public HttpResponseMessage ResourceQuery(string type)
        
            var searchParams = Request.GetSearchParams();

            // do something with the search params
        

        [HttpGet, Route("")]
        public HttpResponseMessage Query(string _query)
        
            var searchParams = Request.GetSearchParams();

            // do something with the search params
        
    

Request.GetSearchParams() 是 Sparks.Engine 的一部分,您可以在此处找到 https://github.com/furore-fhir/spark 我已将 Sparks.Engine 添加到我们的 FHIR 解决方案中,因为它已经实现了许多功能。

 var searchParams = Request.GetSearchParams();

有助于解析 url 中的不同参数,并使其更容易从那里继续前进。

此答案的灵感来自 Brian 在此线程中的先前答案。

【讨论】:

【参考方案2】:

在 sqlonfhir 服务器(我相信 Spark 服务器也是)中,参数的处理不是通过 webapi 路由完成的。

我们都使用路由来提取资源名称、id、操作(以及历史记录和 versionId)所有其他功能都是通过从 RequestUrl 中提取内容并进行处理来手动完成的。

[HttpGet, Route("ResourceName/id/_history/vid")]
public HttpResponseMessage Get(string ResourceName, string id, string vid)

    var buri = this.CalculateBaseURI("ResourceName");
    fhirstore.RegisterKnownUrl(buri);

    if (!Id.IsValidValue(id))
    
        throw new FhirServerException(HttpStatusCode.BadRequest, "ID [" + id + "] is not a valid FHIR Resource ID");
    

    IModelBase model = GetModel(ResourceName, GetInputs(buri));
    var resource = model.Get(id, vid, summary);
    if (resource != null)
    
        var msg = Request.ResourceResponse(resource, HttpStatusCode.OK);
        msg.Headers.Location = resource.ResourceIdentity().WithBase(resource.ResourceBase);
        msg.Headers.Add("ETag", String.Format("\"0\"", resource.Meta.VersionId));
        return msg;
    

    // this request is a "you wanted what?"
    return Request.CreateResponse(HttpStatusCode.NotFound);

(不是完整的代码摘录——我已经剥离了处理二进制资源的代码,以及 _summary 参数内容处理)

此代码中的另一个值得注意的项目是,处理是在模型内完成的(因此我可以在 Web 上下文之外进行单元测试)。 CalculateBaseURI 方法确保请求中的 URL 被应用到结果中的位置,而不需要有一个配置设置来告诉服务器放什么。

在我讨论它的同时,我们也使用媒体格式化程序来解析资源内容。

【讨论】:

我不得不在 Sparks.Engine 代码中进行大量调查,以了解如何真正处理 url。你说的是真的,url是在代码中处理的。

以上是关于.Net 中具有高级搜索和修饰符的 HL7 FHIR 路由的主要内容,如果未能解决你的问题,请参考以下文章

如何访问在android asmack库中具有私有访问修饰符的访问IQTypeFilter?

typescript 具有只读修饰符的类

C# 中修饰符的基础结构和行为

访问修饰符的Scala参数?

如何在不使用唯一修饰符的情况下通过灵活的搜索更新项目类型的所有实例?

java成员变量与局部变量修饰符的区别