Graphql的使用
Graphql 是一种查询语言,用于 API 的设计和查询。它的主要特点是提供了一种灵活、高效、类型安全的数据查询方式,可以减少 API 的请求次数,提高数据传输的效率。
它与 Restful API 对比#
- 数据获取
RESTful API 是面向资源的,每个资源都有一个独立的 URL,通过 HTTP 方法(GET、POST、PUT、DELETE 等)对资源进行操作。GraphQL 是面向数据的,使用查询语言来描述需要获取的数据结构。
- 数据结构
RESTful API 返回的数据结构是固定的,通常是 JSON 或 XML 格式。GraphQL 允许客户端精确地指定需要返回的数据结构,避免了不必要的数据传输。
- 性能
RESTful API 的性能通常受到请求和响应的大小和数量的限制。GraphQL 通过在单个请求中获取多个数据点来提高性能,从而减少了请求次数和响应大小。
- 缓存
RESTful API 使用 HTTP 缓存来提高性能,因为每个资源都有一个独立的 URL。GraphQL 可以使用相同的查询来获取不同的数据,这意味着客户端可以缓存查询并重复使用它们。
- 安全性
RESTful API 使用 HTTP 方法来操作资源,因此需要对每个方法进行身份验证和授权。GraphQL 使用单个 HTTP 方法(POST)来处理所有请求,因此需要在查询语言中定义安全性。
js 搭建一个 Graphql 服务
import Koa from 'koa';
import mount from 'koa-mount';
import { createHandler } from 'graphql-http/lib/use/koa';
import { user_schema } from './lib/user_schema';
const app = new Koa();
// 定义数据源
const users = [
{ id: '1', name: 'Alice', age: 25, email: 'alice@example.com', posts: [{ id: '1', title: 'First Post', content: 'Hello world!' }] },
{ id: '2', name: 'Bob', age: 30, email: 'bob@example.com', posts: [{ id: '2', title: 'Second Post', content: 'What a wonderful day!' }] },
];
// 定义resolvers
const root = {
hello: () => 'Hello, world!',
user: ({ id }) => users.find(user => user.id === id),
};
// 将GraphQL服务挂载到'/graphql'路径下
app.use(mount('/graphql', createHandler({
schema: user_schema,
rootValue: root,
graphiql: true // 开启GraphQL的可视化界面
})));
// 启动服务器
app.listen(3000, () => {
console.log('Server started on http://localhost:3000');
});
user_schemal.js
import { buildSchema } from 'graphql';
const user_schema = buildSchema(`
type Query {
hello: String
user(id: ID!): User
}
type User {
id: ID
name: String
age: Int
email: String
posts: [Post]
}
type Post {
id: ID
title: String
content: String
}
`);
export default {user_schema}
通过 GraphQL 查询,这个需要支持 GraphQL 的客户端,发送查询语句
{
hello,
user(id:1){
id,
name,
age,
posts{
id,
title,
content
}
}
}
返回的数据
{
"data": {
"hello": "Hello, world!",
"user": {
"id": "1",
"name": "Alice",
"age": 25,
"posts": [
{
"id": "1",
"title": "First Post",
"content": "Hello world!"
}
]
}
}
}
创建 schema#
schema 文件定义了需要的数据结构,graphQL 有自己的类型系统
graphql.cn/learn/schema/#type-syst...
定义 resolvers#
对每个查询字段,需要生成对应的函数
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: