GraphQL 是一种用于构建 API 的查询语言和运行时环境,它可以帮助前端开发人员更有效地获取数据。本文将介绍 GraphQL 的工作流程,并提供使用教程和示例代码。
GraphQL 工作流程
GraphQL 的工作流程通常包括以下步骤:
- 定义模式:定义 GraphQL 模式,包括类型、字段和查询。
- 发送查询:客户端发送 GraphQL 查询到服务器。
- 解析查询:服务器解析查询并执行相应的操作。
- 构建响应:服务器构建响应并将其发送回客户端。
- 显示数据:客户端接收响应并显示数据。
使用教程
1. 定义模式
GraphQL 的模式由类型、字段和查询组成。类型定义了对象的结构,字段定义了对象的属性,查询定义了客户端可以请求的对象。
以下是一个简单的 GraphQL 模式示例:
// www.javascriptcn.com code example
type User {
id: ID!
name: String!
email: String!
}
type Query {
getUser(id: ID!): User
}在这个示例中,我们定义了一个 User 类型,它有三个字段:id、name 和 email。我们还定义了一个查询 getUser,它可以通过 id 参数获取一个用户对象。
2. 发送查询
客户端可以通过发送 GraphQL 查询到服务器来获取数据。GraphQL 查询是一个字符串,它定义了客户端需要获取的数据和相应的参数。
以下是一个简单的 GraphQL 查询示例:
query {
getUser(id: 1) {
name
email
}
}在这个示例中,我们发送了一个查询 getUser,它获取 id 为 1 的用户对象的 name 和 email 字段。
3. 解析查询
服务器接收到客户端发送的 GraphQL 查询后,会解析查询并执行相应的操作。服务器会查找查询中请求的字段,并将它们映射到相应的数据源。
以下是一个简单的 GraphQL 解析示例:
// www.javascriptcn.com code example
const resolvers = {
Query: {
getUser: (_, { id }) => {
return getUserById(id);
},
},
User: {
name: (user) => user.name,
email: (user) => user.email,
},
};在这个示例中,我们定义了一个 resolvers 对象,它包含了 Query 和 User 的解析函数。当客户端发送查询 getUser 时,服务器会调用 getUser 解析函数,并将 id 参数传递给它。getUser 解析函数会调用 getUserById 函数获取用户对象,并将其返回给客户端。当客户端请求用户对象的 name 和 email 字段时,服务器会调用 User 的解析函数来获取相应的数据。
4. 构建响应
服务器在解析查询后会构建响应,并将其发送回客户端。响应包含了客户端请求的数据和其他相关信息。
以下是一个简单的 GraphQL 响应示例:
{
"data": {
"getUser": {
"name": "John",
"email": "john@example.com"
}
}
}在这个示例中,我们返回了一个包含用户对象的响应。响应中的 data 字段包含了客户端请求的数据。
5. 显示数据
客户端接收到服务器发送的 GraphQL 响应后,会显示数据。客户端可以使用任何支持 GraphQL 的库或框架来处理响应和显示数据。
以下是一个简单的 GraphQL 客户端示例:
// www.javascriptcn.com code example
import { gql, useQuery } from '@apollo/client';
const GET_USER = gql`
query GetUser($id: ID!) {
getUser(id: $id) {
name
email
}
}
`;
function User({ id }) {
const { loading, error, data } = useQuery(GET_USER, {
variables: { id },
});
if (loading) return <p>Loading...</p>;
if (error) return <p>Error :(</p>;
return (
<div>
<p>Name: {data.getUser.name}</p>
<p>Email: {data.getUser.email}</p>
</div>
);
}在这个示例中,我们使用 @apollo/client 库来发送 GraphQL 查询,并使用 useQuery 钩子来处理响应和显示数据。我们定义了一个查询 GET_USER,它获取 id 参数对应的用户对象的 name 和 email 字段。我们还定义了一个 User 组件,它使用 useQuery 钩子来发送查询,并根据响应显示数据。
示例代码
以下是一个完整的使用 GraphQL 的示例代码:
// www.javascriptcn.com code example
const { ApolloServer, gql } = require('apollo-server');
const users = [
{ id: '1', name: 'John', email: 'john@example.com' },
{ id: '2', name: 'Jane', email: 'jane@example.com' },
];
const typeDefs = gql`
type User {
id: ID!
name: String!
email: String!
}
type Query {
getUser(id: ID!): User
}
`;
const resolvers = {
Query: {
getUser: (_, { id }) => {
return users.find((user) => user.id === id);
},
},
User: {
name: (user) => user.name,
email: (user) => user.email,
},
};
const server = new ApolloServer({ typeDefs, resolvers });
server.listen().then(({ url }) => {
console.log(`Server ready at ${url}`);
});在这个示例中,我们使用了 apollo-server 库来创建 GraphQL 服务器。我们定义了一个 users 数组,它包含了两个用户对象。我们还定义了一个 GraphQL 模式,它包含了一个 User 类型和一个查询 getUser,它可以通过 id 参数获取一个用户对象。我们还定义了 resolvers 对象,它包含了 Query 和 User 的解析函数。我们使用 ApolloServer 类创建一个服务器,并将模式和解析函数传递给它。最后,我们启动服务器并监听请求。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67d1321ea941bf7134288bce