2013年3月2日土曜日

22.Google Cloud Endpointsを試してみた (3/3)

このエントリーをはてなブックマークに追加






Ryo Yamasaki(@vierjp)です。

今回もGoogle Cloud Endpointsについてです。

前回・前々回の
Google Cloud Endpointsを試してみた (1/3)
Google Cloud Endpointsを試してみた (2/3)
では、「Server側(バックエンド)の作成」と「Androidクライアントの作成」を試してみました。

その後、Web先端技術味見部#17 (今回は「Google Cloud Endpoints」!)
という勉強会でのサポートの依頼があったので、
JavaScriptからのEndpointsの呼び出しも試してみました。

隣でサポートするだけの予定が急遽前に出て話す事になったので
当日の説明はグタグダになってしまいましたが。。orz


◯JavaScriptからの呼び出し方

JavaScriptからAPIを呼び出す場合もAndroidの場合と同様、
関数を呼び出すだけです。

以下は一覧取得APIを実行して結果をコンソールログに出力するだけの簡単なサンプルです。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>Endpointsのテスト</title>
<script type="text/javascript">
function init() {
 var ROOT = 'http://localhost:8888/_ah/api';
 // APIを使うための初期化処理
 gapi.client.load('testEndpoint', 'v2', function() {
  // 一覧取得APIの実行
  gapi.client.testEndpoint.tests.list().execute(function(resp) {
   console.log(JSON.stringify(resp));
  });
 }, ROOT);
}
</script>
<script src="https://apis.google.com/js/client.js?onload=init"></script>
</head>

<body>
 <div>
  <h1>Endpointsのテスト</h1>
 </div>
</body>
</html>

注意点として、公式ドキュメントに書いてある以下の記述について、

var ROOT = 'https://your_app_id.appspot.com/_ah/api';
gapi.client.load('your_app_id', 'v1', function() {
    doSomethingAfterLoading();
}, ROOT);

「load」関数の第一引数として書かれている「your_app_id」はおそらく間違いで、
@APIアノテーションの「name」で指定したAPI名を指定するのが正しいと思います。
(実際にドキュメントの後半のサンプルでは「API名」を指定しています)

参考:
Using Endpoints in a JavaScript Client


◯JavaScriptからアクセスする場合は明示的なクライアント・ライブラリの生成が不要

JavaScriptでアクセスする場合には、
Androidの場合に行ったような「明示的なクライアント・ライブラリの生成作業」は必要ありません。
2013/03/29追記
「WEB-INF/*****.api」ファイルは自動的に生成されますが、
・「WEB-INF/*****-rest.discovery」
・「WEB-INF/*****-rpc.discovery」
の2ファイルは明示的に「クライアント・ライブラリの生成作業」を行うことで生成されます。


Endpointsを使用して作成したAPIは、「Google Discovery API」の仕様に準拠するために必要な機能が自動で用意されます。

そして前項のサンプルのように、
この仕様に基づいてAPIの実行に必要な情報をアプリから取得(load)し、
目的のAPIを実行(execute)できるようになっています。

第一回で触れた「API Explorer」で、
作成した各APIをそれぞれのAPIの仕様に沿ったフォームから簡単に実行できるのも
「Google Discovery API」の仕様に準拠しているためです。

Googleが公開している各種のAPIも多くが「Google Discovery API」の仕様に準拠しています。
例えば以下のブログはEndpointsとは関係の無い記事ですが、
JavaScriptだけでGoogle URL Shortener APIを使う | せかいろぐ

Googleが提供する短縮URLを生成するためのサービス「Url Shortner」の
JavaScript APIも、具体的なAPI名や関数名を除けば
前項のEndpointsのサンプルと使い方が同じである事がわかると思います。

このようにEndpointsで公開したAPIは「Google Discovery API」の仕様に準拠しているため、
特に専用のクライアントライブラリを必要とすることなく、
Googleの各種APIを扱うのと同じように利用することができるわけです。

参考:
API Reference - Google APIs Discovery Service — Google Developers


◯サンプルアプリ

JavaScript経由でEndpointsを通じてCRUDする動作サンプル
突貫で作ったので結構適当です(;´∀`)

サンプルアプリのeclipseプロジェクト
Bitbucketの公開リポジトリに配置しています。
サーバー側の実装も前回までに使用したものとは少し変わっていますが、やってることはほとんど同じです。

サンプルアプリのAPI Explorer
Endpointsの第一回に書いた「API Explorer」を実際に動作させることが可能です。


◯まとめ

Endpointsを使う場合、JavaScriptからAPIにアクセスする場合にも
自分で非同期通信の処理等を書くことなく、
関数を呼ぶだけでAPIを呼び出して処理を実行して結果を取得することができます。

Endpointsで作成したAPIは、自動的に「Google Discovery API」の仕様に準拠します。

そのため明示的なクライアント・ライブラリの生成を行う必要はなく、
JavaScriptで「Google Discovery API」の仕様に沿って呼び出すことで、APIを実行することが可能です。


といったところで、Endpointsの第三回は「JavaScriptからの実行方法」でした。
もしかしたらEndpoints でのOAuth2.0対応についてもそのうち調べて書くかも?

それではまた(`・ω・´)ノシ

* 2013/04/12 追記 OAuth2については以下をどうぞ

appengine ja night #24 Google Cloud Endpoints and BigQuery
のスライドで説明しています。






このエントリーをはてなブックマークに追加