2018年12月13日 星期四

HL7 FHIR Server初體驗 - 測試篇

好不容易(其實很容易)安裝好FHIR Server,接著要看看能不能用。
目前Client端程式還沒開發,得找一些工具來進行測試。這邊建議:
  1. Fiddle
  2. Postman
兩個都是免費,這邊使用Postman。本篇重點是對FHIR Server作存取測試,請自行深入研究Postman。這兒,假設您已經安裝妥當(需要註冊)。開啟正常,應得下列畫面。
  1. 這兒就是verb,你想對Server操弄的方法。若不熟,那就得先懂Restful。(以後再補說明)
  2. 這是URI。還記得還記得Server的Endpoint吧!http://localhost:4080/。後接Resource與ID或參數,來向Server進行CRUD的功能。若不熟Resource,那就得先懂HL7 FHIR對Resource的定義。(以後也會補說明)
  3. 正式發送請求。
  4. HTTP訊息的檔頭,例如Content-Type的轉換JSON或XML。還好,可設定不用記。
  5. 這個是訊息主體,尤其是POST與PUT的時候,需要夾帶資源內容,就是放在這兒。
==========

1. 看看系統支援哪些資源以及方法、參數

  1. 是查詢,所以用Get。使用metadata這個資源,可取出FHIR Server支援狀況。
  2. 得到Server回應結果。

2. 有支援Organization資源嗎?

就實作情境來說,Client端要向FHIR Server進行存取時,得問問人家有沒有支援。
目前還沒開發Client,先用前面的回應結果來查詢。
  1. 先選查詢按鈕。
  2. 輸入查詢內容。要找Organization這個Resource,故,查詢內容輸入"type": "organization"。(注意,我們回傳格式是JSON)
這下子我們可以安心來查詢了。

3. 目前Server有哪些Organization資源

  1. 輸入URI。別忘了Endpoint與資源。目前是查詢所有Organization,不接任何參數。
  2. 回傳結果。喔,目前筆數為0。

4. 新增一筆Organization

沒有Client端程式,也不懂FHIR Resource,怎麼辦。沒關係,從官網複製一份就好。(http://www.hl7.org/fhir/organization-examples.html)
這邊就挑HL7 itself。選XML或JSON皆可。但傳送時,要先宣告。這邊採用JSON。
  1. 因為要新增,所以verb選POST。
  2. 輸入URI。應該看懂格式了吧。
  3. 因為是POST,訊息要帶內容,所以,切到Body。
  4. 選擇raw,然後下面方框貼入剛剛複製的內容。
  5. 我們選擇的是JSON格式。
  6. 因為是POST,所以,原本訊息的ID欄位要刪除。若堅持要用原本的ID,那verb要改成PUT。
點選Send按鈕後,看看伺服器的回應。
  1. 系統回傳給我們這筆新增的Organization資源。此時,id已經有資料了。這個格式是GUID(8-4-4-4-8)。有些Server會給流水號ID(HAPI FHIR Test Server)。就實作交換的角度,前者才是世界唯一,後者只能是此伺服器唯一。
請記得這個ID,等會我們新增一個病人是會用到。

5. 新增一筆病患

當然是從官網的Patient資源取得範例資料。(不贅述了)
  1. 注意URI的資源已經改成Patient。其他的就一樣了。
  2. Body部分有兩點:(1) ID要砍掉;(2) Organization的參照連結的ID要改成,剛剛我們新增所得到的ID。
看看系統回傳什麼?
恭喜!成功新增了。
一樣,記住這個ID。

6. 想改病患的姓名

如果我們想要改Resource內容呢?就得準備兩個資料:(1) 要改哪一筆,就是透過ID;(2)新的內容,就是透過Body。
  1. verb改成PUT。
  2. URI除原本的資源路徑外,後面再接要修改對象的ID。(記得,實際情況是電腦處理,不是人)
  3. 要修改的內容。(注意,並不需要帶其他資料,但整體格式要對)
來看看Server給什麼回應。
Server順利回傳我們修改過的資源內容。

7. 真的有修改到嗎?

想要驗證是否正確,那就是用GET,但有指定ID。
  1. 用GET。
  2. 修改URI的內容。
  3. 真的是修改後的版本。

8. 那之前的還在嗎?

這是版控的問題。HL7 FHIR有內建此機制。詳細語法(history):

  GET [base]/[type]/[id]/_history{?[parameters]&_format=[mime-type]}
  GET [base]/[type]/_history{?[parameters]&_format=[mime-type]}
  GET [base]/_history{?[parameters]&_format=[mime-type]}
那如何操作呢?
  1. 因為是查詢,用GET。
  2. URI是使用Patient這個資源的特定ID,詢問其歷史資料。注意,_history是機制,不是參數,前無須打?。
  3. 查詢結果,Server用Bundle這個資源打包。之前做了兩次異動(1次新增,1次更新),固有兩筆。回應訊息中,也包含了完整url,系統實作時簡單多了。
  4. 如果真的要調回特定的那個版次的資料,那又得就得加入versionId的資料了。

9. 調回特定版次

想要調回特定版次的資料,其語法(vread)為:

GET [base]/[type]/[id]/_history/[vid] {?_format=[mime-type]}

所以,若要調回第一次新增時的版次。得在_history後接vid。
  1. 在_history之後接vid。(當然是參考上述步驟所傳回的資料,否則,誰記得了這一大串數字呢?)
  2. 姓名內容是當初新增時範例資料內容。
=========
後記
一路走到這,應該已經大致掌握玩弄HL7 FHIR的能力了。大部分的資源玩法都一樣。
當然,一個好的伺服器也很重要,像這個FHIR Server有支援到STU 3。
可是,這個伺服器畢竟是別人設計的,為什麼不自己設計一個。
這類型的FHIR Server是屬於general purpose。在我的認知與計畫,是要發展一套Profile-Base的FHIR Server。努力,再努力。只是希望有更多資源投入。
總之,下階段先搞定Client端的應用程式。也是一樣,玩弄架構搞定,所有的資源都一樣。

沒有留言:

張貼留言