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

在.Net中使用高级搜索和修改器的HL7 FHIR路由,.net,hl7-fhir,.net,Hl7 Fhir,我目前正试图用FHIR搜索来解决路由问题 在网页的段落2.1.1.48字符串中,有一节介绍如何使用修饰符返回包含或匹配所提供参数值的结果 例: 我从未见过这样的URL使用这些自定义修饰符“?name:exact/contains”在f.ex中被接受。现成的web api服务 据我所知,不允许在文章的行中写东西 [Route("{type}/name:contains/{name}")] public HttpResponseMessage GetContainsName(string name

我目前正试图用FHIR搜索来解决路由问题

在网页的段落2.1.1.48字符串中,有一节介绍如何使用修饰符返回包含或匹配所提供参数值的结果

例:

我从未见过这样的URL使用这些自定义修饰符“?name:exact/contains”在f.ex中被接受。现成的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
}
在sqlonfhir服务器(我相信Spark服务器也是如此)中,参数的处理不是通过webapi路由完成的

我们都使用路由来提取resourcename、id、操作(以及历史记录和版本id)。所有其他功能都是通过从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参数content processing)

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


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

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

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

这些方法应该接受如下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的一部分,您可以在这里找到它 我已经将Sparks.Engine添加到我们的FHIR解决方案中,因为它已经实现了很多功能

帮助解析url中的不同参数,并使其更易于继续


这个答案的灵感来源于Brian在本帖中的前一个答案。

请看一看这个问题:我不得不调查Sparks.Engine代码中的很多内容,以了解url的实际处理方式。你说的是真的,url是在代码中处理的。
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
        }
    }
}
 var searchParams = Request.GetSearchParams();