我第一次尝试使用GraphQL

首先

你好。我是一名有4个月开发经验的工程师。主要负责后端开发。
这次我要写关于GraphQL学习的内容。

GraphQL是什么?

GraphQL是一种API的查询语言,并且是一个用于执行这些查询的运行时的现有数据。来自GraphQL官方网站。

查询语言?运行时?因为不太清楚,所以要查一下。

查询语言

查询语言是一种用于向GraphQL服务器发出请求的语言。
有三种类型:用于获取数据的查询(query),用于更新数据的变更(mutation),以及来自服务器端的事件通知订阅(subscription)。

クエリの種類意味効果queryデータの取得GETmutationデータの更新POST/PUT/DELETEsubcriptionイベントの通知Websocket

※GraphQL服务器:用于使用查询语言所需的服务器。它负责与数据源通信,根据需要获取和修改数据。

※服务器端:在服务器上运行的程序。

※运行时:执行程序时的相关操作。

GraphQL的結局就是一種用於使用查詢語言所需的組件,是這樣的嗎?

GraphQL的特点

GraphQL在于只有一个端点的特点。
端点是指访问API所需的URI。
在REST API中,需要对每个资源进行单独的请求,请求次数和资源数量成正比。
例如,获取”用户信息”、”关注者列表”和”发布列表”需要总共3次请求。
而GraphQL可以通过一次请求从一个端点获取所有必要的信息。

换句话说,通过将多个HTTP请求合并为一个请求,可以减少HTTP请求的次数,并且在执行查询时可以更精细地设置条件,从而只获取所需的数据。

试着实际运行GraphQL

只有进行调查还很难理解画面,所以我会亲自试一试。

使用Apollo构建GraphQL服务器

Apollo是一個可以輕鬆構建GraphQL服務器的庫。我們將參考ApolloServer的Get started教程進行設置。

    新しいプロジェクト用フォルダ作成
mkdir graphql-server-example
cd graphql-server-example
    新しいNode.jsプロジェクトをnpmで初期化
npm init --yes
    実行結果
Wrote to /Users/i.kohei.noguchi/graphql-server-example/package.json:

{
  "name": "graphql-server-example",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

安装必要的库

执行Apollo Server应用程序需要安装apollo-server和graphql这两个组件。

npm install apollo-server graphql
    実行結果
added 113 packages, and audited 114 packages in 10s

3 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities

执行后,内容将保存在node_modules目录中。然后,在项目的根目录下创建一个index.js文件,并写入以下内容。

const { ApolloServer, gql } = require('apollo-server');

const typeDefs = gql`
  type User {
    name: String
    age: String
    gender: String
  }

  type Query {
    users: [User]
  }
`;

const users = [
  {
    name: 'noguko',
    age: '28',
    gender: 'female'
  },
  {
    name: 'noguo',
    age: '30',
    gender: 'male'
  },
];

const resolvers = {
  Query: {
    users: () => users,
  },
};

const server = new ApolloServer({ typeDefs, resolvers });

server.listen().then(({ url }) => {
  console.log(`?  Server ready at ${url}`);
});

启动服务器

使用以下命令启动服务器。

node index.js

然后打开以下链接http://localhost:4000/进行访问。

? Server ready at http://localhost:4000/
スクリーンショット 2022-01-16 16.47.38.png

执行查询

スクリーンショット 2022-01-17 13.48.12.png

您可以在页面的左侧查看可以搜索架构或执行的查询列表。
中间是用于编写查询的编辑器部分,执行结果将在右侧显示。

接下来我们将对之前在index.js中编写的部分进行测试。
编写一个可以正常工作的查询,以验证是否有响应返回。
GraphQL的查询由根类型决定。
根类型包括Query、Mutation、Subscription等用于表示与数据源交互的操作的类型。
点击蓝色部分的ExampleQuery来执行查询,响应结果将会在右侧返回。

スクリーンショット 2022-01-17 13.51.05.png

这个例子中,我们定义了一个名为User的模式,并在其下定义了数据源。
模式是用来表达GraphQL API规范的工具,用于定义客户端可以通过查询获取的数据结构。

// スキーマの定義
const typeDefs = gql`
  type User {
    name: String
    age: String
    gender: String
  }

  type Query {
    users: [User]
  }
`;

// データソース
const users = [
  {
    name: 'noguko',
    age: '28',
    gender: 'female'
  },
  {
    name: 'noguo',
    age: '30',
    gender: 'male'
  },
];

在上述的情况下,只是定义了架构和数据源,要实际操作数据需要创建解析器。↓

// リゾルバ関数を定義してクエリ実行時のデータ操作を行う
const resolvers = {
  Query: {
    users: () => users,
  },
};

通过从客户端执行查询,可以访问数据源。
GraphQL可以仅获取所需数据。
如果只需要name信息,只需从查询部分删除age和gender,则只会显示name的数据。

最后

通过实际运行GraphQL,我对以前对查询语言、模式语言和解析器的理解模糊的部分有了基本的理解,也在一定程度上取得了进展。
另外,我觉得只请求所需的数据非常方便。为了能够熟练掌握GraphQL技术,我打算继续进行输入和输出的循环。

广告
将在 10 秒后关闭
bannerAds