先日、Movable Type 6が正式にリリースされました。今回は、MT6の新しい機能のひとつであるData APIについて、簡単なサンプルを用いて紹介したいと思います。こちらの記事でも、Data APIについて紹介しているのでこちらも見ていただくと、より理解が深まるかもしれません。
そもそもAPIは何かというと、あるプラットフォームを開発する際に使える命令や関数の集合体を表します。予めライブラリ(SDK)が用意されているため、1〜10までプログラムをする必要がありません。代表的なAPIとして、Facebook APIやTwitter API等があります。
Data APIを利用することによって、MTの管理画面(mt.cgi)を経由せずにMTのDBに読み書きすることができます。つまり、データの取得や書き込みをするために管理画面を使う必要がありません。Data APIのドキュメントはこちらをご覧ください。
用意されているSDKはJavaScriptだけ(2013.12.9現在)ですが、JSONが扱えるプログラミング言語であればAPIは使用することができます。SDKの使い方はこちらをご覧いただきつつ、そのほかnode.jsやPHPを用いたData APIの使い方については下記のブログが参考になると思います。
Data APIを使ってみる(その2)
http://www.h-fj.com/blog/archives/2013/07/16-101341.php
Movable Type 6 の新機能Data APIから記事一覧を取得
http://tejunsho.com/perl/20130711000181.html
主に利用されるメソッドについては下記の通りです。
getEntry (エントリーの情報を取得) listEntries (エントリ一覧を取得) createEntry (エントリー作成) updateEntry (エントリー更新) deleteEntry (エントリー削除) uploadAsset (アセットのアップロード) listCategories (カテゴリの一覧) publishEntries (再構築)
便利になった分、注意をしなくてはいけないこともあります。
Data APIを使用するためには、mt-data-api.jsを読み込む必要があります。
<script src="http://UserDomain/mt6test/mt-static/data-api/v1/js/mt-data-api.js"></script>
Data APIのコンストラクタは、MT.DataAPIを利用します。
var api = new MT.DataAPI({ baseUrl: 'http://UserDomain/cgi-bin/mt6test/mt-data-api.cgi', clientId: 'test' });
mt-data-api.cgiがあるURLを記述します。
MTログインユーザ名でなく、任意の文字列。このIDは認証やcookieを利用する場合に利用されます。
listEntriesは、ブログ記事の一覧を取得するためのメソッドです。
api.listEntries(_siteId, params, function(response) { // レスポンスを取得時に実行される処理 });
パラメータについては、小粋空間さんの記事に詳しく書いてありますので、こちらが参考になると思います。今回はパラメータを設定せずに、記事一覧を取得したいと思います。実際に使っているサンプルソースは、read.jsを見てください。
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Data API 読み込みテスト</title> <!-- JSライブラリを読み込む。mt-staticにもともと入ってる。 --> <script src="http://UserDomain/mt-static/data-api/v1/js/mt-data-api.js"></script> </head> <body> <h1>読み込みサンプル</h1> <div id="read">結果を表示</div> </body> <script src="read.js"></script> </html>
'use strict'; var _siteId = 1, api = new MT.DataAPI({ // mt-data-api.cgiがあるURLを記述 baseUrl: 'http://UserDomain/cgi-bin/mt/mt-data-api.cgi', // clientIDはMTログインユーザ名でなく、任意の文字列。このIDは認証やcookieを利用する場合に利用される clientId: 'test' }); // エントリの一覧を取得 api.listEntries(_siteId, function(response) { var _doc = document, _response = response; // 認証がエラーの場合の処理 if(_response.error) { alert(_response.error.code + ':' + _response.error.message); return false; } var _read = _doc.getElementById('read'), _i = -1, _responeItemsLength = _response.items.length; // 記事を取得してHTMLに表示 for(_i, _responeItemsLength; ++_i < _responeItemsLength;) { _read.appendChild(_doc.createTextNode('entryTitle: ')); _read.appendChild(_doc.createTextNode(_response.items[_i].title)); _read.appendChild(_doc.createElement('br')); } });
createEntryメソッドは、MTに記事を投稿するメソッドです。記事を投稿するためには、まずauthenticate使用して認証する必要があります。
api.authenticate({ username: MTのユーザー名, password: パスワード, remember: クッキーの有無 }, function(response) { // コールバック処理 // 認証されると投稿が可能になります });
var entryData = { 'title':ブログ記事のタイトル, 'body':ブログ記事の内容, 'status':ブログ記事の状態 }; api.createEntry(_siteId, entryData, function(response) { // レスポンスを取得時に実行される処理 });
実際に使っているサンプルソースは下記write.jsを見てください。
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>書き込みサンプル</title> <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script> <script src="http://UserDomain/mt-static/data-api/v1/js/mt-data-api.js"></script> </head> <body> <h1>書き込みサンプル</h1> <input type="text" id="user" placeholder="ID"> <input type="password" id="pass" placeholder="PW"> <input type="button" id="loginBtn" value="LOGIN"> <hr> <div id="result">結果を表示</div> <hr> <div id="entryForm"> <input type="text" id="entryTitle" placeholder="タイトルはこちらに"> <br> <textarea id="entryBody" placeholder="本文をこちらに"></textarea> <br> <input type="button" id="submitBtn" value="SUBMIT"> </div> <script src="write.js"></script> </body> </html>
'use strict'; var api = new MT.DataAPI({ // mt-data-api.cgiがあるURLを記述 baseUrl: 'http://UserDomain/cgi-bin/mt/mt-data-api.cgi', // clientIDはMTログインユーザ名でなく、任意の文字列。このIDは認証やcookieを利用する場合に利用される clientId: 'test' }); // エントリの一覧を取得 jQuery(document).ready(function() { var _checkLogin, _setEntry, _submitEntry, $entryForm = jQuery('#entryForm'), $loginBtn = jQuery('#loginBtn'), $sumibtBtn = jQuery('#submitBtn'), $result = jQuery('#result'), $user = jQuery('#user'), $pass = jQuery('#pass'), $entryTitle = jQuery('#entryTitle'), $entryBody = jQuery('#entryBody'); // ログインをチェックする _checkLogin = function() { api.authenticate({ username: $user.val(), password: $pass.val(), remember: true }, function(response) { if(response.error) { $result.html('エラーです'); } else { _setEntry(); } }); }; // データを投稿するための処理 _submitEntry = function() { var _siteId = 1, _entryData = { 'title' : $entryTitle.val(), 'body' : $entryBody.val(), 'status' : 'Publish' }; api.createEntry(_siteId, _entryData, function(response) { if (response.error) { $result.html('エラーです'); } else { $result.html('ポストしました'); } }); }; // 投稿画面を表示 _setEntry = function() { $result.html('ログインしました'); api.getToken(function(response) { if(response.erro) { $result.html('トークンエラー'); } else { $entryForm.show(); $sumibtBtn.on('click', _submitEntry); } }); }; $entryForm.hide(); $loginBtn.on('click', _checkLogin); });
Data APIによってMT本体を介さずとも、データの取得やデータの投稿が可能なりました。特定の目的に限定した独自に管理画面を作ったり、FacebookやTwitterのAPIと連動して同時に記事を投稿したりする仕組みをJSベースで開発することも可能かと思います。
Data APIによって、MTとは違ったスタイルでCMSの構築・運用が可能になります。Web制作側としては、サイト制作のためのツールとしてMTを構築するだけではなく、Data APIを用いてスマートフォン用のアプリを開発したり、ブログではない用途のコンテンツ管理システムを企画・提案できれば、導入先企業の満足にも繋がると思います。