×

Rails 5 によるAPIの概要・Rails API 5でJSON APIを構築

ご存知のように、API アプリケーションはブラウザにユーザー インターフェイスを持たず、代わりに JSON または XML データ ... のみが表示されます。したがって、API アプリケーションを作成する場合、ライターは、API を使用する開発者、特に QA をサポートするために添付されたドキュメントを作成する必要があります。 ドキュメントを作成するには多くの方法がありますが、最も簡単な方法は、たとえば Excel または Word ファイルに手書きで書き込むことです。この API が何のためにあるのか、それにアクセスするための URL は何なのか、リクエストを送信するデータは何か、返すレスポンス データは何なのかを指定してください... その後、必要に応じて開発者/QA 側に送信します。使う・読みます。 この方法は非常に手作業であり、多くの労力を要しますが、それらを使用する人にもたらされる価値は必ずしも高いとは言えません。なぜなら、単純に統一されたフォーマットがなく、情報が不足しやすいからです。

Rails 5 によるAPIの概要・Rails API 5でJSON APIを構築

 2021年06月10日

Rails 5 によるAPIの概要・Rails API 5でJSON APIを構築

ご存知のように、API アプリケーションはブラウザにユーザー インターフェイスを持たず、代わりに JSON または XML データ ... のみが表示されます。したがって、API アプリケーションを作成する場合、ライターは、API を使用する開発者、特に QA をサポートするために添付されたドキュメントを作成する必要があります。

ドキュメントを作成するには多くの方法がありますが、最も簡単な方法は、たとえば Excel または Word ファイルに手書きで書き込むことです。この API が何のためにあるのか、それにアクセスするための URL は何なのか、リクエストを送信するデータは何か、返すレスポンス データは何なのかを指定してください... その後、必要に応じて開発者/QA 側に送信します。使う・読みます。

この方法は非常に手作業であり、多くの労力を要しますが、それらを使用する人にもたらされる価値は必ずしも高いとは言えません。なぜなら、単純に統一されたフォーマットがなく、情報が不足しやすいからです。

 

1. Rails 5 のAPI モードの概要


Rails 5 がついに正式にリリースされ、それで、使用する新しい追加機能を見てみましょう。

最初に話すのは、Rails 5 のAPI モードの登場です。これにより、以前にコントローラーに含める必要があった面倒なものを使用することなく、Web API を構築できます。

1.1 Web API とは

API は Application Programming Interfaces の略です。簡単に理解すると、2 つのソフトウェアが相互に通信できるインターフェースです。現在、Web API を構築する為に非常に一般的で使われ、モバイルアプリケーションやJavaScriptアプリケーションのバックエンドとして使用されています。Web API は、HTML の代わりに JSON (または XML) を使用することがよくあります。 JSON は、自動化されたクライアントにとって理解しやすく、使用しやすく、現在、使用する Web API で簡単に見つけることができます。

1.2 Rails5のAPIモードの起源

実際には、この機能はRails 5 に統合された Rails API プロジェクトです。

1.3 Rails 5 のAPI モードの使用方法

単純な Rails API のみのアプリケーションの作成は次のとおりです。

 rails new my_app --api 

--api を使用することで、生成されたアプリケーションはミドルウェアを削減し、ActionController::API によって ActionController::Base から継承する代わりに、ビュー/ヘルパー/アセットと ApplicationControllers も作成しません。その後、config/application.rb ファイルに追加され、アプリケーションが Web API のみになります。

 # config/application.rb 

 MyApp モジュール 

 class Application < Rails::Application 

 config.api_only = true 

 end 

 end 

そして、通常の RoR アプリケーションとまったく同じようにアプリケーションを簡単に開発できます。そのアプリケーションには、ビュー、ヘルパー、またはアセットはすべて既にクライアント内にあるため、何もありません。ビューの代わりに、おそらくシリアライザーのようなものを使用して JSON ドキュメントを構築します。

1.4 Sinatra や Grape の代わりに Rails API モードを使用するのはなぜ

Grape や Sinatra などのよりコンパクトでシンプルなものを使用するのではなく、Rails を使用して Web API を構築する理由をよく尋ねられます。フレームワークは小さなアプリケーションの構築に対応できますが、ORM、いくつかのビルダー、自動リロード機能などに加えて、使用するライブラリをすばやく見つけることができます。そして最終には、アプリケーションをさまざまなライブラリから構成された巨大な Rails アプリケーションに変えることができます。それは本当に悪いことではありません。このアプローチでは、使用する gem を正確に選択できます。しかし、Rails を使用することを決定することは、他の選択肢に対する適切な選択肢でもあります。さらに、Rails ハンドルには使用できるものがたくさんあり、別の小さなフレームワーク (セキュリティ、条件付き GET、キャッシングなど) を探す必要はありません。

1.5 Rails API モードはいつ使用する

アプリケーションが Web API である場合は、Rails 5 のAPI モードのみを使用したほうがいいです。これは、HTML を送信するのではなく、クライアントが簡単に使用でき、好んで使用できる JSON または XML を送信することを意味します。ラックミドルウェアは、パイプラインのデザインパターンの完全な実装であり、非常に重く、要求と応答のオブジェクト上で実行するためにRoRのに使用されています。

1.6 ミドルウェア

Rack ミドルウェアは、パイプライン設計パターンの完全な実装であり、要求および応答オブジェクトで実行するために RoR で非常に頻繁に使用されます。デフォルトでは、Rails API のみのアプリケーションには限られたミドルウェアが付属しています。これは、それらが不要な機能に削減されていることを意味します。 ミドルウェアの追加は、application.rb ファイルに宣言行を追加するのと同じくらい簡単です。 たとえば、API に Rack::Deflater を追加する場:

 # config/application.rb 

 module Alexandria class Application < Rails::Application 

 config.api_only = true 

 config.middleware.use Rack::Deflater 

 end 

次のコマンドを使用して、アプリケーションで使用されているミドルウェアを一覧表示できます。

 

2 . Rails API を構築するのはJSON API バージョン。


2.1 JSON API とは

JSON API は、リソースに対するクライアント要求を取得または変更する方法と、サーバーがそれらの要求をバックアップする方法の仕様です。

JSON API は、クライアントとサーバーの間で渡される要求の数とデータの量の両方を最小限に抑えるように設計されています。 この効果は、読みやすさと柔軟性を損なうことなく実現されます。

2.2 データをフォーマットする方法

api JSON シリアル化データ には、次のものが含まれている必要があります。

  • JSOn API 応答のルート レベルは JSON オブジェクトです。
  • このオブジェクトには、トップレベルのデータを持つキーが含まれます。
  • キーには、レコードを表す単一の JSON オブジェクト、またはレコードを表すJSON オブジェクトのコレクションを指します。データが含まれます。
  • JSON オブジェクトは、以下を含むレコードを表します。
  • レコードの IDです。
  • レコードタイプ、つまりposts cats などのリソースの名前です。
  • そのレコードのプロパティを表すキーと値のペアを含む JSON オブジェクトを指す属性キー。 ここに表示されるプロパティがある場合は、データをシリアル化する方法によって決まります。
  • リソースと他の JSON API リソースとの間の関係を説明する JSON オブジェクトを指す関係のランダム キーです。

2.3 Rails 5 API JSON API を実装する

 gem install rails --pre 

 rails new catbook --api --database=postgresql 

JSON API が進むべき道であり、データのフォーマット方法の基本的な理解ができたので、JSON API を構築してみましょう。

2.4 アプリ

Cat の関連のデータとその設定を提供する単純な Rails 5 API を構築します。したがって、私たちのアプリには の主2つ要なリソースがあります: 猫と趣味です。 猫は興味がたくさんあり、趣味は猫がたくさんいます。 私たちは多対多の関係を持っています。

  •  ステップ1: 開始する

Rails 5 での最初の実行:

次に、先に進み、ディレクトリに 入りGemfile に次の gem を追加します。

 gem 'active_model_serializers' 

 gem 'rack-cors' 

次に実行します:

 bundle install 

次に、JSON API API アダプターを設定する必要があります。 ファイルを作成する

 config/initializers/active_model_serializer.rb 

そして確立する:

 ActiveModelSerializers.config.adapter = :json_api 

これにより、Rails にデータを JSON API 形式でシリアル化するように指示します。

また、データを受信するとき (サーバーへの jhacsh POST データのとき) JSON API

受け入れるようにアプリに指示する必要があります。 同じファイルに次を追加します。

 api_mime_types = %W( 

 application/vnd.api+json 

 text/x-json 

 application/json) 

 Mime::Type.register 'application/vnd.api+json', :json, api_mime_types 

最後に CORS を設定することを忘れないでください。 Rack-cors gem を使用しています。

 

  • ステップ2:ドメイン モデル

CatHobbyCat Hobbies のリソースを作成します。 次のプロパティを持つ Cat に移行します。

 class CreateCats < ActiveRecord::Migration[5.0] 

 def change 

 create_table :cats do |t| 

 t.string :name 

 t.string :breed 

 t.string :weight 

 t.string :temperament 

 t.timestamps 

趣味:

 class CreateHobbies < ActiveRecord::Migration[5.0] 

 def change 

 create_table :hobbies do |t| 

 t.string :name 

 t.timestamps 

 end 

と猫の趣味:

 class CreateCatHobbies < ActiveRecord::Migration[5.0] 

 def change 

 create_table :cat_hobbies do |t| 

 t.references :cat, index: true 

 t.references :hobby, index: true 

 t.timestamps 

 end 

次に、関連付けを使用してモデルを設定します。

 # app/models/cat.rb 

 class Cat < ApplicationRecord 

 has_many :cat_hobbies 

 has_many :hobbies, through: :cat_hobbies 

 end 

 # app/models/hobby.rb 

 class Hobby < ApplicationRecord 

 has_many :cat_hobbies 

 has_many :cats, through: :cat_hobbies 

 end 

 # app/models/cat_hobby.rb 

 class CatHobby < ApplicationRecord 

 belongs_to :cat 

 belongs_to :hobby 

 end 

  • ステップ 3: ルートとコントローラー

次の方法でルーターの名前空間を設定します。

 Rails.application.routes.draw do 

 namespace :api do not 

 namespace :v1 do you 

 resources :cats, except: [:new, :edit] 

 resources :hobbies, except: [:new, :edit] 

 end 

およびコントローラー構造:

 ├── app 

 ├── controllers 

 ├── api 

 └── v1 

 ├── cats_controller.rb 

 └── hobbies_controller.rb 

 ├── application_controller.rb 

Cat Hobbies ルーターの定義がないことに注意してください。 これは、このデータを使用するユーザーは、関連する猫と趣味、および関連する趣味と猫を表示する必要がありますが、猫の趣味は表示する必要がないためです。

  • ステップ4: シリアライザー と JSON レンダリン

顧客が猫に関する記録を要求する場合、関連する趣味の記録も含めたいと考えています。

実際、そのデータをサイドローディングしたいと考えています。

これは、顧客が猫の記録を要求したときに、特定の趣味または関連する趣味の記録全体を含めることを意味します。

2.5 猫のシリアライザ

次に、猫のプロパティとそれに関連する趣味をシリアル化するために、猫のシリアライザーを定義します。

 class CatSerializer < ActiveModel::Serializer 

 attributes :id, :name, :breed, :weight, :temperament 

 has_many :hobbies 

 end 

これにより、Rail は cat にレコードを提供するときに、関係するデータを説明する関係のキーを含めるように指示します。 したがって、次のように Cats#index を定義するとします。

 module Api 

 module V1 

 class CatsController < ApplicationController 

 def index 

 render json: Cat.all 

各猫の関連する趣味のデータを説明するキーの関係が存在することがわかります。 しかし、まだデータをサイドローディングしていません。 ここには実際の趣味の記録はありません。データをサイドローディングするには、コントローラーに追加する必要があります。

 render json: Cat.all, include: ['hobbies'] 

これで、猫のリクエストに関連する実際の趣味の記録を含むトップレベルのキーができました。

2.6 最適化: N+1

ただし、このデータは、各猫の好みのリクエストを1つずつデータベースに送信するため、現時点では読み込みが少し遅いです。 次の2つのデータベース リクエストを行っています。

 Cat Load (0.4ms) SELECT "cats".* FROM "cats" INNER JOIN "cat_hobbies" ON "cats"."id" = "cat_hobbies"."cat_id" WHERE "cat_hobbies"."hobby_id" = $1 [["hobby_id", 1]] 

これをきれいにして、猫に関連するすべての設定について、データベースに1回だけクエリを実行します。

コントローラーのレンダリングを変更します。

 render json: Cat.includes(:hobbies), include: ['hobbies'] 

これにより、データベース内のクエリが次のように変更されます。

2.7 ホビーシリアライザ

Hobby レコードで提供されるデータには、関連する猫の説明データを指すキー関係が含まれていることに気付いたかもしれません。

それは、私のホビー シリアライズをセットアップしているからです。

 class HobbySerializer < ActiveModel::Serializer 

 attributes :id, :name 

 has_many :cats 

 end 

または、ホビー コントローラーで以下を使用して、ホビーのリクエストに応じて、Cat レコード フォレストが含まれる ことを確認できます。

 

3. まとめ

多くのテスト バージョンを使用した長い開発期間を経て、数百人の開発者と数千のコミットを備えた Rails 5.0 は、これまでで最も安定した完全な Rails バージョンの 1 つになりました。

Rails 5.0 のリリースは、Rails コミュニティが依然として非常に強力に維持および発展していることを証明しています。

 

オフショア開発をご検討されている方々はぜひ一度ご相談ください。

※弊社の連絡先は以下の通り

アカウントマネージャー: クアン(日本語・英語対応可)

電話番号: (+84)2462 900 388

メール:  [email protected]

お電話でのご相談/お申し込み等、お気軽にご連絡くださいませ。