我目前正试图用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
}
答案 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在此主题中的前一个答案。