[Rails] REST API Clientを実装するgemについて調べてみた

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

モバイルアプリサービス部@モバイルバックエンドグループの五十嵐です。

データベースを持たずに REST API 経由でデータを管理するRailsアプリケーションを作る場合、皆さんならどうするでしょうか。HTTP Clientクラスを作って、Parseクラスを作って、Modelレイヤーに振る舞いを実装するでしょうか。実はそれらを自前で作らなくても、Modelレイヤーに HTTP Client としての機能をもたせ、ActiveRecordのような振る舞いを提供する gem があります。

今回はそのようなREST API Client となる gem と、APIのモックテストをするために必要な gem を紹介します。

REST API Client

調べてみたところ、代表的な gem が3つほどありました。それぞれ機能や特徴を見てみましょう。

-

(https://github.com/rails/activeresource) GitHub★539 - remiprev/her GitHub★1289 - whichdigital/active-rest-client GitHub★371

activeresource

railsのリポジトリにある通り、Rails2.0から標準機能として追加されましたが、Rails4.0で標準機能からは削除されました。

機能としてはValidationやAssociationなどはサポートしているものの、後に紹介する2つに比べると拡張性は低いそうです。モックテストに必要な機能も標準搭載されています。

her

次に登場したのがこの gem で、GitHubのスターの数からも現時点で最も人気が高いのはこれなのではないでしょうか。

特徴としては、HTTP Client に faraday を使用しており、ORM の機能と HTTP Client の機能が分離されています。これによって、HTTP Client としては faraday のミドルウェアを使うことで自由に拡張ができ、her 自体も ORM として多くの機能や拡張性を提供しています。

機能としては activeresource の機能に加え、フィルターアクション、 ActiveModel::Serializers や JSON API の対応、RESTful でないカスタムAPIへの対応、キャッシュ機能など、思いつく機能は概ね揃っています。

active-rest-client

her よりも少し後に登場したのが、この gem です。ドキュメントを読む限り、書き方は her と異なるのですが、こちらも今では faraday を使っているし ORM としての機能もそれほど変わらないのではと思います。

active-rest-client の Issue #1 に、「her があるのになぜ作ったの?」みたいな問いがあって、「her は RESTful でない URI に対応できないため」、みたいなことが書かれているのですが、今となっては her も対応しているので、her との差としては書き方や細かい機能の差くらいしかないのではないでしょうか。


実際、今回のRailsアプリケーションでは her を使って全ての(RESTfulでないURIも含む)URIに対するモデルを作ってみたんですが、対応できないようなURIのケースはありませんでした。

モックテスト

Web API をモックに置き換えてテストするための gem についてです。こちらは調べたところ、Webmock の一択という感じでした。そのほかに、VCR という gem があり、これは一度HTTPリクエストをすることでそのレスポンスの内容を記録しておき、2回目以降は実際のHTTPリクエストなしにレスポンスを再現できるというものです。vcr を webmock と合わせて使うことで簡単にモックテストが実装できるというものです。

今回は Modelレイヤーの HTTP リクエストには her を使うので、her のモックテスト機能を使っていき、一部 her を使わない HTTP リクエストについては Webmock を使うことにしました。

まとめ

Web API を Modelレイヤーとして扱うなら her を使いましょう。といっても、このアプリケーションまだ作り始めたばかりなのでまだまだハマりどころはあるかもしれません。次回以降、具体的な使用例をいくつか紹介してみようと思います。her 自体の使い方は、ドキュメントが充実しているので特に紹介しませんが、皆さんも是非見てみてください。