何がしたいのか
Star Wars API を使って
GraphQL で複数のテーブルが関連したデータを取ってくる練習がしたかった。
appPlanets というエンドポイント?を叩いた。
https://www.back4app.com/database/davimacedo/swapi-star-wars-api/graphql-playground/all-planets
Chrome でアクセスするだけで実行できる
Back4App というところを使った。
定義はこの公式のスキーマの 483 行目から。
Root -> allPlanets
type Root {
allFilms(after: String, first: Int, before: String, last: Int): FilmsConnection
film(id: ID, filmID: ID): Film
allPlanets(after: String, first: Int, before: String, last: Int): PlanetsConnection
planet(id: ID, planetID: ID): Planet
node(
"""The ID of an object"""
id: ID!
): Node
}
Root に AllPlanets が結び付けられている。
そしてそれが PlanetsConnection で Planet を参照しているようだ。
PlannetsConnection -> Planet
type PlanetsConnection {
totalCount: Int
planets: [Planet]
}
PlannetsConnection の定義のコードを見ると
planets として Planet の配列が参照されている。
なので今回は planets をエンドポイントとして叩く。
Planet
単体の Planet の定義もみてみる。
type Planet implements Node {
"""The name of this planet."""
name: String
gravity: String
created: String
id: ID!
}
- name
- gravity
- created
- id
これらの順番で中身が並べられている。
Back4App で planets の GET を実行する
https://www.back4app.com/database/davimacedo/swapi-star-wars-api/graphql-playground/all-planets
Back4App なら Star Wars API の
リポジトリを clone して npm start しなくても
URL を開くだけで実行できる。
query allPlanets {
planets (skip: 0, limit: 3) {
results {
id,
name,
gravity,
createdAt,
}
}
}
allPlanets という名前(ここは自由)で定義して
planets を叩く。
skip は 0 で最初のひとつめから、
limit は 3 で 3 つだけ
JS の関数の戻り値と似た感じで、
返す値は results で定義するようだ。
呼び出す順番は自由。
{
"data": {
"planets": {
"results": [
{
"id": "JNgiSeuJwR",
"name": "Yavin IV",
"gravity": "1 standard",
"createdAt": "2019-12-13T19:42:31.014Z"
},
{
"id": "lZHyO0MIr6",
"name": "Dagobah",
"gravity": null,
"createdAt": "2019-12-13T19:42:31.017Z"
},
{
"id": "PL36fSGLoW",
"name": "Tatooine",
"gravity": "1 standard",
"createdAt": "2019-12-13T19:42:30.901Z"
}
]
}
}
}
結果は json で返ってくる。
data/tableName/results に入っている。
skip を 1 にすると
最初の Yavin IV が skip されて
Alderaan が 3 つめに食い込んでくる。
filmConnection で Planet に結びつく Film も GET する
filmConnection(after: String, first: Int, before: String, last: Int): PlanetFilmsConnection
Planet には Film とむすびつける
filmConnection というカラムもある。
これは PlanetFilmsConnection を使っていて
type PlanetFilmsConnection {
pageInfo: PageInfo!
totalCount: Int
films: [Film]
このようになっている。
なので、films を追加すれば
惑星に関連するフィルムたちも取れるだろう。
type Film implements Node {
title: String
director: String
releaseDate: String
}
Film には
title, director, releaseDate,
これらの項目があったのでそれらをいれて
query allPlanets {
planets (skip: 0, limit: 3) {
results {
id,
name,
gravity,
createdAt,
films {
results {
title,
director,
releaseDate
}
}
}
}
}
planets にリクエスト項目を追加する。
"createdAt": "2019-12-13T19:42:30.901Z",
"films": {
"results": [
{
"title": "A New Hope",
"director": "George Lucas",
"releaseDate": "1977-05-25T00:00:00.000Z"
},
{
"title": "Attack of the Clones",
"director": "George Lucas",
"releaseDate": "2002-05-16T00:00:00.000Z"
},
すると、films の項目で
惑星データに関連する映画のタイトル、監督、公開日、これらが取れた。
まとめ
GraphQL をてっとり早く試すには
Back4App の Starwars API の
Planets と Films のデータが便利。
type Root {
allPlanets(after: String, first: Int, before: String, last: Int): PlanetsConnection
}
Root で allPlanets として PlanetsConnection
が結びついている。
なので allPanets というエンドポイントが発生すると推測する。
type PlanetsConnection {
totalCount: Int
planets: [Planet]
}
PlanetsConnection が planets として
Planet たちの配列を取っている。
type Planet implements Node {
name: String
id: ID!
}
そして Planet の内部に id や name などのカラムが入っている。
query allPlanets {
planets (skip: 0, limit: 3) {
results {
id,
name,
この形でリクエストする。results の中にカラムを書く。
filmConnection(after: String, first: Int, before: String, last: Int): PlanetFilmsConnection
Planet の中にさらに filmConnection という
Planet と Films を結びつけるカラムがあり
PlanetFilmConnection を呼び出している
type PlanetFilmsConnection {
pageInfo: PageInfo!
totalCount: Int
films: [Film]
PlanetFilmsConnection には films として
Film たちの配列が入っている。
これをリクエストするには、
query allPlanets {
planets (skip: 0, limit: 3) {
results {
id,
name
films {
results {
title,
director,
releaseDate
}
このように、results の films の更に results として
Film のカラムを書いてリクエストする。
以上。
Top comments (0)