日医標準レセプトソフト API

ORCAにはWebAPIが提供されている。これを日医標準レセプトソフト APIという。詳細は下記のサイトを見るとよい。
日医標準レセプトソフト API
これで何ができるかというと、ORCAに登録した様々な情報を取得したり登録や変更、削除までできるようだ。今回はORCAのスマホビューアを作ってみようと思う。
まず、どのようなプログラムになるかを大雑把につかむため、複数の患者情報の取得(patientlst2v2)というAPIのサンプルプログラムを作ってみた。まず、javascriptのプログラムを以下に示す。
<!DOCTYPE>
<!--

 複数の患者情報取得(patientlst1v2)

-->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<script src="//code.jquery.com/jquery-1.12.0.min.js"></script>
<script src="//code.jquery.com/jquery-migrate-1.2.1.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){
 var url = 'http://172.16.108.250/~mtanaka/orca/patientlst1v2.php';

 $.ajax({
  type: 'POST',
  data:{
   'user': 'ormaster',
   'password': 'ormaster'
  },
  url: url,
  async: false,
  cache: false,
  dataType: "xml"
 }).done(function(xml, status, error){
  //alert('status=' + status + ', error=' + error);
  if (status == 'success') {
   var status_line = $(xml).find('status_line').text();
   alert('status_line=[' + status_line + '], typeof(status_line)=' + typeof(status_line));
   if(status_line == '') {
    parsePatientList(xml);
   } else {
    alert('error status_line=' + status_line);
   }
  } else {
   alert('文書データ取得失敗');
  }
 }).fail(function(xhr, status, error){
  var message = "xhr.status = " + xhr.status + ", xhr.statusText = " + xhr.statusText + ", status = " + status + ", error = " + error;
  alert('サーバから応答がありません: ' + message);
 });
});
function parsePatientList(xml) {
 var html = '';
 $(xml).find('Patient_Information_child').each(function(){
  html += '<tr>';
  html += '<td>' + $(this).find('Patient_ID').text() + '</td>';
  html += '<td>' + $(this).find('WholeName').text() + '</td>';
  html += '<td>' + $(this).find('WholeName_inKana').text() + '</td>';
  html += '<td>' + $(this).find('BirthDate').text() + '</td>';
  html += '<td>' + $(this).find('Sex').text() + '</td>';
  html += '<td>' + $(this).find('CreateDate').text() + '</td>';
  html += '<td>' + $(this).find('UpdateDate').text() + '</td>';
  html += '</tr>';
 });
 alert('html=' + html);
 $('#patientlst').html(html);
}
</script>
<title>ORCA 患者情報取得テスト (patientlst1v2)</title>
</head>
<body>
<h1>ORCA 患者情報取得テスト (patientlst1v2)</h1>
<table border="1">
 <thead>
  <tr>
   <th>Patient_ID</th>
   <th>WholeName</th>
   <th>WholeName_inKana</th>
   <th>BirthDate</th>
   <th>Sex</th>
   <th>CreateDate</th>
   <th>UpdateDate</th>
  </tr>
 </thead>
 <tbody id="patientlst">
 </tbody>
</table>
</body>
</html>

次にPHPで作成したProxyプログラムを示す。
<?php
//
// 日医標準レセプトソフト API
//   患者番号一覧の取得
//     http://www.orca.med.or.jp/receipt/tec/api/patientidlist.html
//
 file_put_contents('./debug.txt', "---patientlst1v2.php---\r\n");

 $user = $_REQUEST['user'];
 $password = $_REQUEST['password'];
 file_put_contents('./debug.txt', '$user='.$user.', $password='.$password."\r\n", FILE_APPEND);

 $base_url = 'http://172.16.108.250:8000';
 $header  = array(
  "Authorization: Basic ".base64_encode($user.":".$password),
  //"Authorization: Basic b3JtYXN0ZXI6b3JtYXN0ZXI=" //ormaster:ormaster
  "Content-Type: application/xml"
 );

 $data = '<data>';
 $data .= '<patientlst1req type="record">';
 $data .= '<Base_StartDate type="string">2016-05-01</Base_StartDate>';
 $data .= '<Base_EndDate type="string">2016-07-01</Base_EndDate>';
 $data .= '<Contain_TestPatient_Flag type="string">1</Contain_TestPatient_Flag>';
 $data .= '</patientlst1req>';
 $data .= '</data>';
 file_put_contents('./debug.txt', '$data='.$data."\r\n", FILE_APPEND);

 $ch = curl_init();
 curl_setopt($ch, CURLOPT_URL, $base_url.'/api01rv2/patientlst1v2?class=01');
 curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
 curl_setopt($ch, CURLOPT_POSTFIELDS, $data); // xmlデータを送信
 curl_setopt($ch, CURLOPT_HTTPHEADER, $header); // リクエストにヘッダーを含める
// curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
 curl_setopt($ch, CURLOPT_HEADER, true);   // ヘッダーも出力する
 $response  = curl_exec($ch);
 $header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE); 
 $header = substr($response, 0, $header_size);
 $hlines = explode("\r\n", $header);
 file_put_contents('./debug.txt', 'count($hlines)='.count($hlines)."\r\n", FILE_APPEND);
 file_put_contents('./debug.txt', '$hlines[0]='.$hlines[0]."\r\n", FILE_APPEND);
 $status_line = $hlines[0];

 file_put_contents('./debug.txt', '$response='.$response."\r\n", FILE_APPEND);
 $body = substr($response, $header_size);
 $body_size = strlen($body); 
 file_put_contents('./debug.txt', '$body_size='.$body_size."\r\n", FILE_APPEND);
 curl_close($ch);
 //echo "**response**\n";
 //echo $response;
 //echo "**header(".$header_size.")**\n";
 //echo $header;
 //echo "**body**\n";
 if($body_size > 0) {
  echo $body;
 } else {
  echo "<status_line>".$status_line."</status_line>";
 }
?>
さて、ここでなぜPHPファイルが必要なのか説明しなければならない。Webブラウザにはクロスドメイン制限というセキュリティ上の制約があり、URLのうち(プロトコル、ホスト名、ポート番号)の組が異なる場合はこの制限を受けてWebAPIが利用できない。ORCAのWebAPIはポート番号が8000である。したがって、たとえ同じサーバにWEBサーバを立ち上げてもこの制限によってWebAPIが利用できない。これを回避するためにProxyプログラムを作成し、Webブラウザからの要求をWebサーバ上で動くProxyプログラムへ送り、そのProxyプログラムからORCAのWebAPIを呼び出して、その結果をWebブラウザへ返すという処理を行う。これを行っているのが上記のPHPプログラムである。そしてWebブラウザで動くjavascriptプログラムはAjaxの宛先URLとしてこのProxyプログラムのURLを指定している。なお、ProxyプログラムはORCAのWebAPIの返すXMLデータをそのままWebブラウザへ返すので、直接ORCAのWebAPIを利用した場合と同じ処理を書くことができる。なお、クライアントがWebブラウザではなくMonacaを使ったスマホアプリの場合はクロスドメイン制約は受けないのでProxyプログラムは不要である。しかしながらWebブラウザで動くWebアプリと同じ作りにしておいて方がメンテナンスを考えると楽かもしれない。

XMLの処理

クライアントへはXML形式のレスポンスが返ってくる。このとき、自動的にパースしてくれるみたいで、何もしなくともXMLオブジェクトに変換されている。したがって、専用のメソッドを使うことにより簡単に目的のデータを取り出せる。

Proxyプログラム

ProxyプログラムはORCAのWebAPIに向けれリクエストを行う。そのときcurlという機能を利用する。PHPでcurlを利用するためにはphp5-curlパッケージをインストールしなければならない。
sudo apt-get install php5-curl

0 件のコメント:

コメントを投稿