Skip to content

Latest commit

 

History

History
443 lines (415 loc) · 15.1 KB

20211030122204-graphql.org

File metadata and controls

443 lines (415 loc) · 15.1 KB

GraphQL

:header-args+: :wrap

概要

GraphQLはAPI向けに作られたクエリ言語(SQLと同じジャンル)、実行環境である。

従来のRESTでは事前に決められたリソースをURLを指定して取得するのに対し、GraphQLでは必要なものを指定できる。 複数のリソースを取得するとき、RESTではそれぞれAPIを呼び出す必要があるが、GraphQLでは1回のAPI呼び出しで完了する。 Reactなどと組み合わせて使用される。

基本用語

ミューテーション

データを変更する。 アプリケーションの状態を変更するために作成する。 ミューテーションはアプリケーションで使われる動詞と対応するのが望ましい。 サービスに対してできることがミューテーションとして定義される。

type Mutation {
  postPhoto(
    name: String!
    description: String
    category: PhotoCategory=PORTRAIT
  ): Photo!
}

schema {
  query: Query
  mutation: Mutation
}
mutation {
  postPhoto(name: "Sending the Palisades") {
    id
    url
    created
    postedBy {
      name
    }
  }
}

フラグメント

フラグメントは複数の場所で使いまわすことができる選択セット。

query {
  allTrails {
    ...trailStatus
    ...trailDetails
  }
}

クエリ変数

クエリ内の静的な値を置き換えて動的な値を渡せる。

サブスクリプション

サーバを更新するたびにクライアントで情報をリアルタイムに受け取る。

subscription {
  liftStatusChange {
    name
    capacity
    status
  }
}
mutation closeLift {
  setLiftStatus(id: "astra-express" status: HOLD) {
    name
    status
  }
}

変更内容がサブスクリプションしているクライアントに向けてプッシュされる。

イントロスペクション

APIスキーマの詳細を取得できる機能。

query {
  __schema {
    types {
      name
      description
    }
  }
}
query liftDetails {
  __type(name: "Lift") {
    name
    fields {
      name
      description
      type {
        name
      }
    }
  }
}

スキーマ

GraphQLによって、APIは型の集合としてとらえられるようになる。 データ型の集合をスキーマという。

ユニオン型・インターフェース型

異なる型が混在するフィールドを表現するのに使う。 含まれている複数の型がまったく異なるものであればユニオン型を、共通のフィールドがある場合はインターフェースを利用するのが一般的。

ドキュメント

"""
最低一度は認可されたユーザ
"""
type User {

  """
  ユーザの一意のGitHubログインID
  """
  githubLogin: ID!

  """
  ユーザの姓名
  """
  name: String

  """
  このユーザが投稿した全写真
  """
  postedPhotos: [Photo!]!

  """
  このユーザが含まれる全写真
  """
  inPhotos: [Photo!]!
}

type Mutation {
  """
  GitHubユーザで認可
  """
  githubAuth(
    "ユーザの認可のために送信されるGitHubの一意のコード"
    code: String!
  ): AuthPayload!
}

Emacs設定

Emacsでコード、クエリアクセス、結果出力をプレーンテキストで残す設定。

graphql-modeを追加する。 davazp/graphql-mode: An Emacs mode for GraphQL

ob-graphqlを追加する。 jdormit/ob-graphql: GraphQL execution backend for org-babel

取得元を入力#+BEGIN_SRCに入れることで、org-babelでクエリを実行できる。

query GetContinents {
    continent(code: "AF") {
        name
    code
    }
}

Tasks

Rubyを使っての解説。

導入。

RubyでGraphQLを使う方法。

graphqlの記事。

Reference

ドキュメント。

graphqlのサンプル。

graphqlのサンプル。

GitHubのGraphQL API。

ノードとエッジについてのブログ記事。

サンプルでどんな感じかテストできるサイト。 スターウォーズの情報にアクセスできる。

query {
  person(personID: 5){
    name
    birthYear
    created
    filmConnection {
      films {
        title
      }
    }
  }
}

Archives

  • 86, 100, 124, 147, 185, 190, 197, 229

実際にコードとして書いていくのにはあまり評判がよくない。概要を知るためには役立つよう。 コードサンプルはJavaScript, node.js, expressなので、元からこれらについて知らないとあまりピンとこない感じがする。

メモ。 グラフ理論。グラフは概念同士の関係性を図示するための優れた考え方。 SQLはデータベースのための問い合わせ言語で、GraphQLはインターネットのための問い合わせ言語。