7
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

REST API利用時のNamespaceの重要性(RESTとGraphQLの比較とかも)

Last updated at Posted at 2019-10-19

「Railsで超簡単API」というQiita記事でAPIの勉強をしていたところ、名前空間という概念が出てきたので、まとめました。

Namespace(名前空間)とは

Namespaceとは名前の衝突を防ぐためにレイヤーを整理する概念のこと。Namespaceを使うと、名前が同じであっても、Namespaceが異なっていれば衝突が起きることがない。Namespaceは名字のようなもので、太郎という同じ名前の人間が二人いたとしても、山田太郎と上田太郎は名字が異なるため、概念の衝突を避けることが出来る。コードに起こすと下記のようなイメージ。


namespace YAMADA
{
  name = "Taro"
}

namespace UEDA
{
 name = "Taro"
}

put YAMADA::name
 => Taro

put UEDA::name
 => Taro

最後の出力結果は同じでになるが、出力されたTaroの定義元を見ると、AとBという別々の場所から参照されている。また、Namespaceの内容を別空間から呼ぶ場合は出所も一緒に明示する必要がある。

REST APIとGraphQLの特徴と相違点

REST APIとは

外部からプログラムを呼び出す際の規約の一つで、下記の原則に乗っ取る。

  1. ステートレスな管理(アクセス集中に耐えやすくするため)
  2. 命令系統の事前定義(HTTPのGETやPOSTメソッドなど)
  3. URLとメソッドでリソースを表現する
  4. 情報の内部に、複数の情報へのリンクをもたせることが出来る

#GraphQLとは
Facebook社が開発するWebAPI規格。GithubやNetflix、Airbnbなどが採用していることで有名。「クエリ言語」と「スキーマ言語」から成る。

クエリ言語には以下の3種類がある。

  1. データ取得系のquery
  2. データ更新系のmutation
  3. サーバーサイドのイベント通知のためのsubscription

スキーマ言語はGraphQLの仕様を記述するための言語。下記の様に、クエリの型を定義していく。


type Query {
  currentUser: User!
}

type User {
  id: ID!
  name: String!
}

上記のようなスキーマに対して、下記のようなクエリを発行すると、JSON形式で内容が返ってくる。


query GetCurrentUser {
  currentUser {
    id
    name
  }
}

GraphQLの主な特徴は大きく3つ。

  1. クエリとレスポンスの構造の類似(GraphQLではJSONのなかの欲しいフィールドだけを指定することにより、レスポンスを軽くすることも可能)
  2. スキーマファーストの思想
  3. 単一エンドポイント

REST APIとGraphQLの比較

エンドポイントの数

RESTではエンドポイントが複数あるのに対し、GraphQLはエンドポイントが単一であることが特徴。RESTではURLにてエンドポイントを指定することで、リソースの明文化をすることが出来た。一方GraphQLは("POST /graphql")のような形で単一のエンドポイントだけが存在し、欲しいリソースはbodyの中に書く。

URIやHTTPS構造の使い方

RESTはURIやHTTPSでアクセス先を明確化する一方、GraphQLでは問い合わせ言語とスキーマ言語でアクセス内容を明確化する。

アクセス回数の制限

RESTではサーバー負荷の軽減の観点から1時間あたりのアクセス件数を制限するケースが多いが、GraphQLではこの制限がない。そのため、負荷の計算を自前で行う必要がある。

REST APIにおいてNamespaceの設定が重要な理由

RESTはエンドポイントが複数あるため、APIのURIの設定をわかりやすくするためにNamespaceを設定すると良い。また、この際にディレクトリの構成もNamespaceの構成と統一してあげる必要がある。

Rails.application.routes.draw do
  namespace 'api' do
    namespace 'v1' do
      resources :posts
    end
  end
end

このようなNamespaceの構造を作った場合、下記のようなディレクトリ構成を設定する。

---- controllers
      --- api
        -- v1
         - posts_controller.rb

ちなみにNamespaceを使わなくてもScopeで設定することも可能。
【Ruby on Rails】ルーティング scope と namespace の違い

7
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?