BODIK APIにCKAN-APIのラッパーを追加

JavascriptからCKAN-APIを使おうとしたけど、エラーになって使えない。という声がありました。これをどうにかできないか?

これは、ブラウザのJavascriptで発生する「CORSエラー」ですね。「CORS」とは、「Cross-Origin Resource Sharing」の略で、簡単に言うと、異なるオリジン間でデータの共有を禁止するというブラウザのセキュリティ対策です。

この問題を解決する方法は2つ考えられます。

JSONPを使う

JSONPを使うとクライアントだけで対応できるのですが、JSONPは少々分かりづらい。

CORS対応のAPIサーバーを使う

APIサーバーがCORS対策しているとJavascriptから呼び出せるようになります。CKANは、CORSに対応していないので、JavascriptからCKAN-APIを呼び出すとエラーになってしまいます。

「BODIK APIはJavascriptから呼べるじゃないか?」ですよね? BODIK APIはCORS対策しているので、Javascriptから呼び出してもCORSエラーになりません。

ということで、BODIK API経由でCKAN APIを呼び出せるようにしてみました。

CKAN-APIのラッパー

BODIK APIのSwaggerをご覧ください。https://wapi.bodik.jp/docs/

下の方に「ckan」というセクションがあります。ここにCKAN-APIのラッパーを用意しました。

対象となるCKANは、パラメータ「CKANの名前」で指定します。指定できるCKANは次の2つです。

ODCS:BODIK ODCS(https://data.bodik.jp)
ODM:BODIK ODM(https://odm.bodik.jp)

できることは次の6つ。Swaggerを使ってお試しください。

/ckanapi/organization_list

自治体一覧を取得する。

/ckanapi/package_list

パッケージIDの一覧を取得する。

/ckanapi/package_search

「organ_code」で指定した自治体のパッケージ一覧を取得する。

/ckanapi/package_show

「package_id」で指定したパッケージの詳細情報を取得する。

/ckanapi/resource/list

「res_url」で指定したCSVファイルを読み取り、CSV文字列の2次元配列で返す。CSVファイル以外は読み取れません。
※「ckan_name」は使われませんが、有効な値を指定してください。

/ckanapi/resource/dict

「res_url」で指定したCSVファイルを読み取り、辞書の配列で返す。CSVファイル以外は読み取れません。
※「ckan_name」は使われませんが、有効な値を指定してください。

このCKAN-APIラッパーを使って次のようなシナリオが考えられます。

  1. /ckanapi/organization_listで、自治体一覧を取得する。
  2. /ckanapi/package_searchに自治体コードを指定して、その自治体のパッケージ一覧を取得する。
  3. /ckanapi/package_showにパッケージIDを指定して、パッケージの詳細を取得する。
  4. パッケージ詳細にあるリソース情報からリソースファイルのURLを取得する。
  5. /ckanapi/resource/dictで、URLからCSVファイルを読み取る。

ぜひ、お試しください。

ひらの