MeteorでのRESTfulサービスの作成

概要:MeteorでRESTfulサービスが必要な理由



Meteorは、その使いやすさと、最小限の機能セットで動作するアプリケーションを迅速に作成する機能に惹かれます。 Meteorにはよく発達したコミュニティがあります。 複雑な構成を必要とせず、インストール後すぐに使用できる多くの便利なアドオンモジュールがあります。 優れたドキュメント、例、およびStackOverflowのような多数のフォーラム投稿があります。 Meteorは、クライアントとの便利で多機能なサーバー統合を提供するフルスタックフレームワークです。 では、なぜこの相互作用を超えてRESTfulサービスを作成するのでしょうか?



実際、 クライアント/サーバーアプリケーションは、特定のインターフェイスを介して対話する2つの独立した部分で構成されています。 さらに、クライアント/サーバーアプリケーションの各部分は、異なる人々またはチームによって作成できます。 クライアント部分の開発者は、Meteorの使用にまったく限定されず、他のJSフレームワークを使用できます。クライアントはJSで作成する必要さえありません。たとえば、Javaで記述されたAndroidアプリケーション、Objective Cで記述されたiOSなどです。



これらの理由により、プロジェクトでバックエンドを構築するためにMeteorを選択し、MeteorでRESTfulサービスを作成する方法を探しました。



利用可能なモジュールの概要



適切なモジュールの検索にしばらく時間を費やした後、次のリストを取得しました。



github.com/meteorhacks/picker-たとえば Express.jsで使用されているものと同様のルーティングを使用します



Picker.route('/post/:_id', function(params, req, res, next) { var post = Posts.findOne(params._id); res.end(post.content); });
      
      





JSON形式で応答を送信する機能



github.com/crazytoad/meteor-collectionapiを使用すると、CRUDコレクション操作用のエンドポイントAPIを作成できます。 アクセスレベル(ゲスト、承認済みユーザー、管理者など)を区切ったり、承認したり、カスタムエンドポイントを作成したりするメカニズムはありません。



github.com/kahmali/meteor-restivusを使用すると、CRUDコレクション操作用のエンドポイントAPIを作成できます。 承認、アクセスレベルの区切り、カスタムエンドポイントの作成のためのメカニズムがあります。 このパッケージについては、以下で詳しく説明します。



github.com/Differential/reststop2は、時代遅れでサポートされていないソリューションです。 リソースのメインページには、このソリューションで利用可能なすべての機能がRestivusにもあることを示すRestivusプロジェクトへのリンクがあります。



github.com/stubailo/meteor-restを使用すると、CRUDコレクション操作用のエンドポイントAPIを作成できます。 承認およびカスタムエンドポイント作成メカニズムがあります。 アクセスレベルを区切るメカニズムはありません。 ドキュメントには、明確で実用的な例が欠けています。 Restivusを統合して、カスタムエンドポイントを作成できます。



Restivusは私が必要とするすべての機能を備えており、GitHubとAtmosphereの両方で最大数の星でマークされているのと、上記のリストの他の2つのプロジェクトがRestivusを参照しているという事実のため、私はそれを選択することにしました。



コレクション、CRUD操作、およびアクセスレベルの使用



Restivusの使用は非常に簡単です。 インストールするには、コンソールに入力します:



 meteor add nimble:restivus
      
      





RESTfulサービスを作成するには、サーバーコードに次の用語を追加します。



 if (Meteor.isServer) { var Api = new Restivus({useDefaultAuth: true}); }
      
      





コンストラクター引数はAPIオプションを渡します。 `useDefaultAuth`オプションの値については、次のセクションで説明します。



あなたがコレクションを登録しているなら、言う



 var Contacts = new Mongo.Collection('contacts');
      
      





そして、APIを介したCRUD操作を介して、最も簡単な形式でアクセスできるようにします。



 Api.addCollection(Contacts);
      
      





これにより、次のエンドポイントが作成されます。



「getAll」エンドポイント

Get / API / Collection

コレクション内のすべてのアイテムに関する情報を返す



「投稿」エンドポイント

POST / API /コレクション

コレクションに新しいアイテムを追加します。



「get」エンドポイント

GET / api / collection /:id

コレクションアイテム情報を返す



「put」エンドポイント

PUT / api / collection /:id

コレクションアイテムを編集



「削除」エンドポイント

DELETE / api / collection /:id

コレクションからアイテムを削除



応答形式は常に次のとおりです。



 {status: "success", data: {}}
      
      





プレフィックス `api /`は、APIが作成されたときに渡される `apiPath`オプションを設定することで別のものに置き換えることができます。 ご覧のとおり、各コレクション操作APIには独自の識別子があります。 次のように使用できます。



 Api.addCollection(Contacts, { excludedEndpoints: ['getAll', 'put'], routeOptions: { authRequired: true }, endpoints: { get: { authRequired: false }, delete: { roleRequired: 'admin' } } });
      
      





この場合、コレクションは削除、取得、およびポスト操作でAPIに登録されました。 get操作の場合、承認は不要です。post操作とdelete操作の場合、管理者のみが削除操作を実行できますが、承認は必要ありません。 承認と認証については、続きを読む



承認と認証



usersコレクションAPIに登録すると、2つの特別なエンドポイントが追加されます。



POST / API /ログイン

GET | POST / API /ログアウト



ドキュメントからの保証にもかかわらず、使用したRestivusのバージョン(0.8.4)では、ロギングはGETリクエストでのみ機能しました。 詳細については、 こちらをご覧ください



ログインするには、次の形式でユーザー名とパスワードを転送する必要があります。



 curl http://localhost:3000/api/login/ -d "username=test&password=password"
      
      





失敗した場合、文字列「Unauthorized」が応答本文に含まれます。

成功すると、次の答えが表示されます。



 {status: "success", data: {authToken: "f2KpRW7KeN9aPmjSZ", userId: fbdpsNf4oHiX79vMJ}}
      
      





トークンとユーザーIDを保存して、承認が必要なEndpoints APIリクエストのヘッダーに渡します。



 curl -H "X-Auth-Token: f2KpRW7KeN9aPmjSZ" -H "X-User-Id: fbdpsNf4oHiX79vMJ" http://localhost:3000/api/contacts/
      
      







カスタムエンドポイント



 Api.addRoute('contacts/favorite/:userId', { get: { authRequired: false, roleRequired: ['author', 'admin'], action: function () { this.response.write({"user-id": this.urlParams.userId}); this.done(); } } });
      
      





このコードは、api / contacts / favorite /にEndpoint APIを登録します。 パスの一部として渡される「userId」パラメーターは、「this.urlParams.userId」として使用できます。 GETリクエストパラメータは、 `queryParams`を介して利用できます。 承認およびアクセスレベルのオプションを説明する必要がない場合は、短い形式を使用できます。



 Api.addRoute('contacts/favorite/:userId', { get: function () { this.response.write({"user-id": this.urlParams.userId}); this.done(); } });
      
      





結果:MeteorでRESTfulサービスを構築することの長所と短所



ご覧のとおり、Meteorは再びプロトタイプをすばやく作成するための便利なツールを提供しました。これはプロジェクトの初期段階で非常に貴重です。 多くの場合、アプリケーションはテキストデータと数値データの処理にとどまりません。 したがって、次のようになります。MeterとRestivus +リソースメカニズム(AngularまたはVueなどで利用可能)=数分で作成されるクライアントとサーバー間の相互作用。



All Articles