HL7 FHIR路由与.Net中的高级搜索和修改器

时间:2016-04-08 12:44:48

标签: .net hl7-fhir

我目前正试图用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

我从来没有见过这些自定义修饰符“?name:exact / contains”在f.ex中被接受的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
}

2 个答案:

答案 0 :(得分:0)

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

我们都使用路由来提取resourcename,id,operation(以及history和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应用于结果上的位置,而无需使用配置设置来告知服务器放置哪些内容。

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

答案 1 :(得分:0)

这是使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();

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

这个答案的灵感来自Brian在此主题中的前一个答案。