BETA

FHIRもどきを題材にしたWebAPIの実装(前編)

投稿日:2020-07-18
最終更新:2020-07-18

やりたいこと

  • (建前)自由にいじれるFHIRリポジトリが手元に欲しい。
  • (本音)C#でWebAPIを実装したい。

FHIR®とは

HL7® FHIR®の公式ページ(英語):HL7 FHIR
日本国内:FHIR研究会
大雑把に言うと、医療情報をやり取りするための標準規格。
データ表現にJSONやXmlを用いたRESTFul API。

前提

本稿は「WebAPIを実装する」ことを主題としています。
真面目にFHIRを使用したい場合は、ちゃんとサポートを受けられる日本向けのFHIRリポジトリなり、
何なら無料のFHIRリポジトリもありますのでそちらを使用してください。(node-fhir-server-mongo

諸注意

  • 医療情報を扱う以上ユーザー認証等のセキュリティ対策は必須ですが、本稿では扱いません。
  • 後々、【クライアントからの患者登録→観察項目の登録→データの参照】をすることを目的とするため、PatientとObservationのみ実装します。また、全Structureの実装はしません。

実装

実装環境:
・ Windows10
・ Visual Studio Community 2019
・ [LocalFHIRRepository] .Net Core 2.1

WebAPI実装のチュートリアルはこちら(docs.microsoft.com)
仮実装はこちら:Github

・ なるべく早くレスポンスを返すことを優先し、WebAPI内(LocalFHIRRepository)では連携ファイルを吐き出すのみとします。
・ DBへのCRUDはバックグラウンドアプリ(RsyncFHIR)で実行することを想定しています。(そちらは後編で。)
・ 現時点ではPOSTのみ実装しています。
・ POST実行時にはResourceに不正がないJSONデータか否かのみを判断します。
・ よって、POST直後にGETを行う等、データが即反映されないケースがあります。別途対策が必要です。

HTTPリクエストのBodyよりJSONを取得し処理を行います。
BodyがJSONではない場合、400を返します。

using System.Net;  
using System.Net.Http;  
using LocalFHIRRepository.Model;  
using Microsoft.AspNetCore.Mvc;  
using Microsoft.Extensions.Options;  
using LocalFHIRRepository.ParameterContainer;  
using Newtonsoft.Json.Linq;  

namespace LocalFHIRRepository.Controllers  
{  
    [Route("[controller]")]  
    [ApiController]  
    public class PatientController : ControllerBase  
    {  
        private readonly IOptions<RepositorySetting> _repSetting;  

        // (中略)  

        // POST: Patient  
        [HttpPost]  
        public HttpResponseMessage Post([FromBody] JObject value)  
        {  
            try  
            {  
                // Settingにより処理方式を変更する  
                BasePostModel postmodel;  
                bool setvalue;  
                if (bool.TryParse(Startup.GetSettings("CoordinateToDirectDB"), out setvalue))  
                {  
                    if (setvalue)  
                    {  
                        postmodel = new DataBasePostModel();  
                    }  
                    else  
                    {  
                        postmodel = new SynchronizeIOPostModel();  
                    }  
                }  
                else  
                {  
                    postmodel = new SynchronizeIOPostModel();  
                }  
                // POST処理実行  
                if (!postmodel.TryPost(new PatientParameterContainer() { JsonParameter = value, }))  
                {  
                    return new HttpResponseMessage() { StatusCode = HttpStatusCode.BadRequest, };  
                }  
                else  
                {  
                    return new HttpResponseMessage() { StatusCode = HttpStatusCode.OK, };  
                }  
            }  
            catch  
            {  
                return new HttpResponseMessage() { StatusCode = HttpStatusCode.InternalServerError, };  
            }  
        }  

        // (中略)  

    }  
}  

所感

実装に関してはほぼチュートリアル通りなので、特筆事項はありません。
バックグラウンド側の本実装後、POST以外のメソッドの実装を行います。
バックグラウンドアプリは、C# + WPFによる実装を行う予定です。(どちらかというとそっちが本題。)

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

@NMatsudaの技術ブログ

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう