「サーモンランAPI」という配信専用のAPIです。
https://splamp.info/salmon/api/
任天堂ソフト「Splatoon2」のサーモンランの最新情報を取得できます。
Apacheサーバー上で、JSONデータを静的ファイルとして配信しています。
これまでスプランプ(※うちのサイト)では「スプステージ2」という名前でバトルステージの情報を返すAPIを運用してきたのですが、こちらはオプションの充実のために、PHPファイルにアクセスさせる動的な仕組みでした。
今回静的ファイルにした理由です。
オプションを付けないほうがシンプル
… タイムゾーンなどの混乱の解消のため、時間データはUnixtimeだけにしました。言語も日英同時に配信することにしました。
サーバー負荷が激減する
… 毎回DBにアクセスしたりせずに済むのでレスポンス速度が向上します。
クライアントでキャッシュが有効になる
… ヘッダのLast-Modified
やE-tag
により、クライアントでキャッシュが有効になります。
APIのアクセス先は一見「/salmon/api/now」や「/salmon/api/all」のように見えますが、実は.htaccess
で「/salmon/api/」の別の子フォルダにあるJSONファイルにリライトしています。
例:
RewriteEngine On
RewriteRule ^all$ xxx.xxx [L]
また、JSONファイルは更新用プログラムによって、定期的に新しいファイルに上書きされます。
更新用プログラムはcronで定期的に更新すべきかチェックしていて、更新があるとDBからデータを取得・整形して、出力します。
JSONは何となく可読性を高めたくなったので、インデントを付けたり無意味なエスケープを消したりしてみました。
$json = json_encode($output, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
今回一番欠かせなかったのはヘッダの付与でした。
毎アクセス動的生成していた頃はPHPのheader()
なんかを使っていたのですが、今回は静的ファイルですから、Apacheの力を借りる他ありません。
Apacheでは、.htaccess
を使うと配下のファイルに対して指定したヘッダを付与することができます。
Header set (ヘッダ名) "(値)"
今回加えたヘッダは以下の二つです。
Header set Access-Control-Allow-Origin "*"
Header set Content-Type "application/json; charset=utf-8"
Content-Type
では、文字化けしたりしないようにUTF-8を明示しています。
Access-Control-Allow-Origin
というのは見たことない人もいるのではないでしょうか。これは、JavaScriptにおいてクロスオリジンでアクセスしてもよいかの指定になります。
これをサーバーが明示的に許可しないとjsがアクセスすることはできません。jsでオープンなAPIが使えないなんてもったいない。*
を指定することで誰でもアクセスできるようになります。(CORS / Cross-Origin Resource Sharingの許可、と呼ばれたりします。)
.htaccess
でヘッダを指定したAccess-Control-Allow-Origin
の指定でjs勢にも利用してもらえるJavaScriptからのアクセス許可については、実際にjs勢の方から問い合わせがあって初めて気づきました。意外と見落としている方は多いんじゃないでしょうか。
個人的な信条として「サーバーサイドの魔法」というのがあります。サーバーサイドは制約が少なく、予想外のことができるということです。Apacheの設定ファイル.htaccess
は特にその幅を広げてくれるので気に入っています。
他にも色々な機能があるので、調べてみると面白いと思います。
.htaccess の書き方 | murashun.jp
サーモンランAPIについて
https://splamp.info/salmon/api/
サーモンランAPIサンプル集(連載)
https://crieit.net/magazines/barley_ural/サーモンランAPIサンプル集
Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?
コメント