STEP5: REST API で Read

このステップでは、ブックマーク一覧取得APIの実装方法と、Meteorのクライアント側からブックマーク一覧取得APIを呼び出す方法について学びます。

5.1 REST API ブックマークリソース設計

ここからはブックマークリソース(bookmarks)の実装を行います。

ブックマークリソースのREST APIは以下の通りです。

API 意味
GET /api/bookmarks ブックマークリソース一覧取得
POST /api/bookmarks ブックマークリソースの新規作成
GET /api/bookmarks/:id 指定したidのブックマークリソース取得
PUT /api/bookmarks/:id 指定したidのブックマークリソース更新
DELETE /api/bookmarks/:id 指定したidのブックマークリソース削除

5.2 ブックマーク一覧取得API実装

ブックマーク一覧を取得するAPIを実装してきましょう。

ソースコードを以下のように修正します。

imports/api/rest.js

import { Restivus } from 'meteor/nimble:restivus';
import Bookmarks from './bookmarks/bookmarks'; // 追加

const Api = new Restivus({ prettyJson: true,});

Api.addRoute('hello', {
  // ...省略
});

// GET /api/bookmarks
Api.addRoute('bookmarks', { 
  get: { 
    action: function() { 
      return { 
        status: 'success', 
        data: Bookmarks.find().fetch(), 
      }; 
    }, 
  },
});

export default Api;

ソースコードを保存したら、ターミナルで動作確認します。

$ curl http://localhost:3000/api/bookmarks

すると、以下のような結果が返ってきます。

{ 
  "status": "success", 
  "data": [ 
    { 
      "_id": "5AwNBRBPS4cArsCGB", 
      "url": "http://www.meteor.com/", 
      "title": "Meteor", 
      "createdAt": "2016-07-22T14:19:14.064Z" 
    }, 
    { 
      "_id": "osgRPH83T2bPoEQM8", 
      "url": "https://guide.meteor.com/", 
      "title": "Meteor Guide", 
      "createdAt": "2016-07-22T14:19:14.064Z" 
    }, 
    { 
      "_id": "BRw643GHnbL8Hsig9", 
      "url": "http://docs.meteor.com/", 
      "title": "Meteor API Docs", 
      "createdAt": "2016-07-22T14:19:14.064Z" 
    }, 
    { 
      "_id": "9wjwws85MGpdHEuzp", 
      "url": "https://forums.meteor.com/",
      "title": "Meteor Forums", 
      "createdAt": "2016-07-22T14:19:14.064Z" 
    }, 
    { 
      "_id": "jWnK9eZPRYb5jZfwN", 
      "url": "https://crater.io/", 
      "title": "Crater.io", 
      "createdAt": "2016-07-22T14:19:14.064Z" 
    } 
  ]
}

ブックマーク一覧が取得できました。

続いて、このAPIをMeteorのクライアント側から呼び出してみましょう。

HTTPクライアント機能を提供する http パッケージを追加します。

$ meteor add http

続いて、クライアント側でブックマーク一覧取得APIを呼び出すようにソースコードを書き換えます。

client/main.js

import { Template } from 'meteor/templating';
import 'bootstrap/dist/css/bootstrap.min.css';
import 'bootstrap/dist/js/bootstrap.min.js';
import './main.html';

import Bookmarks from '../imports/api/bookmarks/bookmarks';

import { ReactiveVar } from 'meteor/reactive-var'; // 追加
import { HTTP } from 'meteor/http'; // 追加

// 追加
Template.Bookmarks.onCreated(function() {
  this.bookmarks = new ReactiveVar();

  // ブックマーク一覧取得
  HTTP.get('/api/bookmarks', (err, res) => { 
    if (err) { console.error(err); return; }
    this.bookmarks.set(res.data.data); 
  });
});

Template.Bookmarks.helpers({ 
  bookmarks: () => Template.instance().bookmarks.get(), // 変更
});

NOTE: HTTP.get() で指定したリソースに対してGETリクエストを実行します。

変更を保存したら、Webブラウザで http://localhost:3000/ にアクセスして動作を確認してみましょう。

Template.Bookmarks.onCreated()は、Bookmarksテンプレートが生成されたタイミングで呼び出されるメソッドです。その中で、ブックマーク一覧を取得し、MeteorのReactiveVarにセットすることで画面に反映させることができます。

ここまでのコード: https://github.com/j-hack/meteor-rest-app/tree/step5.2

5.3 ブックマーク一覧定期取得(ポーリング)

Meteorはデータベースの値を変更した際に、自動的にその変更を通知し、画面を書き換えるリアクティブ性が備わっています。

しかし、REST APIでリソースを取得している場合はそのリアクティブ性が失われ、自動で画面に反映されなくなってしまいます。

そのため、リソースの追加や変更がある度にブラウザを手動でリロードする必要があります。

このままだと開発効率があまりよろしくありません。

そこで定期的にAPIをポーリングすることで、擬似的にリアクティブ性を出すようにします。

ソースコードを以下のように修正します。

client/main.js

// ...省略

import Bookmarks from '../imports/api/bookmarks/bookmarks';
import { ReactiveVar } from 'meteor/reactive-var';
import { HTTP } from 'meteor/http';
import { Meteor } from 'meteor/meteor'; // 追加

Template.Bookmarks.onCreated(function() { 
  this.bookmarks = new ReactiveVar();

  const fetchBookmarks = () => { 
    // ブックマーク一覧取得 
    HTTP.get('/api/bookmarks', (err, res) => { 
      if (err) { console.error(err); return; }
      this.bookmarks.set(res.data.data); 
    }); 
  }; 
  fetchBookmarks();

  // 定期実行
  Meteor.setInterval(fetchBookmarks, 5000); 
});

// ... 省略

NOTE: Meteor.setInterval()は、JavaScriptのsetInterval()と同様の機能を持つメソッドです。

これで定期的に(上記の場合は5秒に1回)、ブックマーク一覧取得が行われるようになります。

ここまでのコード: https://github.com/j-hack/meteor-rest-app/tree/step5.3

5.4 ブックマークリソース取得(個別)

指定したIDのブックマークリソースを個別取得するAPI(GET /api/bookmarks/:id)を実装しましょう。

ソースコードを以下のように書き換えます。

imports/api/rest.js

// ...省略

// GET /api/bookmarks
Api.addRoute('bookmarks', { 
  // ...省略
});

// GET /api/bookmarks/:id
Api.addRoute('bookmarks/:id', { 
  get: { 
    action: function() { 
      const bookmarkId = this.urlParams.id; 
      return { 
        status: 'success', 
        data: Bookmarks.findOne(bookmarkId), 
      }; 
    }, 
  },
});

export default Api;

変更を保存したら、ターミナルで以下のコマンドを実行します。

$ curl http://localhost:3000/api/bookmarks/<ブックマークID>

<ブックマークID>は、各環境で異なるため、各自変更してください。


NOTE: ブックマークIDを確認するには、/api/bookmarks に対してGETリクエストを実行します。

$ curl http://localhost:3000/api/bookmarks

例えば、<ブックマークID>が「jWnK9eZPRYb5jZfwN」の場合は、以下のように実行します。

$ curl http://localhost:3000/api/bookmarks/jWnK9eZPRYb5jZfwN
{ 
  "status": "success", 
  "data": { 
    "_id": "jWnK9eZPRYb5jZfwN", 
    "url": "https://crater.io/", 
    "title": "Crater.io", 
    "createdAt": "2016-07-22T14:19:14.064Z" 
  }
}

ここまでのコード: https://github.com/j-hack/meteor-rest-app/tree/step5.4

レスポンスが確認できたら、次のステップに進みましょう。

results matching ""

    No results matching ""