2016-04-08 7 views
1

現在、私はFHIR検索を使用したルーティングについて頭を抱えています。.Netの高度な検索と修飾子を使用したHL7 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 

私はこれらのカスタム修飾子でそのようなURLを見たことがない:f.ex.に受け入れられている「?名前は、正確な/含まれています」ボックスからのWeb APIサービス。

私の知る限り見ることができるように、それは(と私はまた、スパークサーバーを信じる)sqlonfhirサーバで

[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

この質問をご覧ください:http://stackoverflow.com/questions/2053132/is-a-colon-safe-for-friendly-url-use –

答えて

0

のラインで何かを書くために許可されていないパラメータの処理が行われていません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が結果の場所に適用され、サーバーに何を配置するかをサーバーに指示する構成設定を行う必要はありません。

私はそれについて議論していますが、私たちはメディアフォーマッタを使ってリソースの内容も解析します。

+0

私はSparks.Engineで多くを調査しなければなりませんでしたURLが実際にどのように処理されているかを確認するコード。あなたが言っていることは本当です、URLはコード内で処理されます。 – Verzada

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 
     } 
    } 
} 

のように見えるサーバー用のコードのようなURLを受け入れなければならないのいずれかの方法

でヒットを取得しますRequest.GetSearchParams()はSparks.Engineの一部です。ここで見つけることができますhttps://github.com/furore-fhir/spark 私はSparks.EngineをFHに追加しましたIRソリューションを提供しています。

var searchParams = Request.GetSearchParams(); 

は、URLで異なるパラメータを解析して助け、そこから前進することが多く容易になります。

この回答は、Brianのこのスレッドの以前の回答に触発されています。