1. Hugoで外部APIデータの取得

1-1. HugoでData-Driven Content機能を利用する

Hugoで外部APIのURLで取得したCSVやJSONデータを利用できるData-Driven Content機能があります。

文書生成時で取得したデータです(ページ表示の毎アクセス時ではありません)。

1-2. WEB APIのテスト

http://project.iw3.org/zip_search_x0401/ - ZIP SEARCH API SERVICE 「JIS X0401」対応版ver 1.0.0

サンプル例としてIW3 PROJECTのページで紹介されている以下の例でテスト。

http://api.thni.net/jzip/X0401/JSON/郵便番号上3桁の数値/郵便番号下4桁の数値.js

郵便番号 => 住所を返してくれるWEB APIだ。

$ curl http://api.thni.net/jzip/X0401/JSON/753/0070.js
{ "state":"35", "stateName":"山口県", "city":"山口市", "street":"白石" }
1-3. Shortcode呼び出しを作成

Data-Driven Contentは記事のMarkdownファイルではなく、HTMLで記述する部分で機能するものであるため、 Shortcodeを作ってその中に記述します。

  • layouts/shortcodes/zipaddress.html
{{ $dataJ := getJSON "http://api.thni.net/jzip/X0401/JSON/" (.Get 0) "/" (.Get 1) ".js" }}
<ul>
  <li>state = {{ $dataJ.state}}</li>
  <li>stateName = {{ $dataJ.stateName}}</li>
  <li>city = {{ $dataJ.city}}</li>
  <li>street = {{ $dataJ.street}}</li>
</ul>

Hugo文書のMarkdown中で

{ {< zipaddress "753" "0070" >} }:置き換え{{}}

とすると表示上Shortcodeで変換されて

state = 35
stateName = 山口県
city = 山口市
street = 白石

これはページ閲覧のたびに毎回データが取得されなおされるのではなく、Hugoはあくまでも静的なサイトジェネレーターであるので、ページがビルドされる時に取得されます。

またページがビルドされる時にも一度取得されたJSONデータがあると、データがキャッシュされて再利用されます。

1-4. Data-Driven Contentのデータキャッシュ

Data-Driven Contentでは一度取得されたデータは公式サイトの説明にあるようにキャッシュされます。

hugoに–ignoreCacheオプションを渡せば、キャッシュされませんが、デフォルトでは一旦取得した結果は $TMPDIR/hugo_cache/以下に保存されます。$TMPDIRはシステムや環境によってディレクトリは違います。

サーバー起動してビルドが走った際のキャッシュデータ

$ ls $TMPDIR/hugo_cache/my-blog/filecache/getjson/

尚、キャッシュのディレクトリを変更する場合、config.tomlで設定します。

以上