
在 Web 开发世界里,前后端“吵架”似乎是常态。后端开发者希望返回结构清晰的数据,而前端开发者希望只拿自己需要的字段,不要多、不用少。REST API 虽然经典,但数据结构固定,往往造成前端拿到了一大堆自己不需要的数据,或者缺少一些关键信息,不得不再请求一次,白白增加了网络开销。
这时候,GraphQL 作为一种新型 API 设计方式,就像是一个调解员,帮我们解决这个数据沟通问题。今天,我就来聊聊如何使用 GraphQL 构建一个灵活的数据 API,让开发变得更加顺畅!
在 REST API 里,我们通常有多个固定的端点,比如:
GET /users/123
GET /users/123/posts
GET /posts/456/comments每个端点返回固定的数据结构,前端如果需要组合数据,就必须多次请求不同的端点,再在前端拼接。这不仅增加了网络开销,还让代码变得臃肿。
GraphQL 的出现,彻底颠覆了这种设计。它只有 一个端点(通常是 /graphql),但允许前端通过 查询语言 来指定自己需要的字段。这意味着前端可以在一个请求中获取所有需要的数据,而不必额外请求多个端点。
举个例子,前端可以这样发送 GraphQL 查询:
query {
user(id: "123") {
name
age
posts {
title
comments {
text
}
}
}
}后端只返回前端需要的字段,不多不少。这不仅优化了网络请求,还让 API 更加高效灵活。
让我们从零开始,搭建一个简洁的 GraphQL API,后端使用 Node.js 和 Apollo Server,数据库使用 SQLite。
首先,我们需要安装 Apollo Server 和 GraphQL:
npm install apollo-server graphql sqlite3然后,创建一个新的 server.js 文件,开始编写代码。
在 GraphQL 里,数据的结构由 Schema 定义,我们先写一个简单的用户和文章数据模型:
type User {
id: ID!
name: String!
age: Int!
posts: [Post]
}
type Post {
id: ID!
title: String!
comments: [Comment]
}
type Comment {
id: ID!
text: String!
}
type Query {
user(id: ID!): User
posts: [Post]
}这个 Schema 规定了:
User 有 id、name、age 和一组 posts。Post 有 id、title 和一组 comments。Comment 只有 id 和 text。Query 是 GraphQL API 的入口点,可以获取 user 和 posts 数据。在 GraphQL 里,Resolver 负责处理具体的数据查询。比如,我们可以用 SQLite 作为数据库,编写逻辑:
const { ApolloServer, gql } = require('apollo-server');
const sqlite3 = require('sqlite3').verbose();
const db = new sqlite3.Database(':memory:');
const typeDefs = gql`
type User {
id: ID!
name: String!
age: Int!
posts: [Post]
}
type Post {
id: ID!
title: String!
comments: [Comment]
}
type Comment {
id: ID!
text: String!
}
type Query {
user(id: ID!): User
posts: [Post]
}
`;
const resolvers = {
Query: {
user: (_, { id }) => {
return new Promise((resolve) => {
db.get("SELECT * FROM users WHERE id = ?", [id], (err, row) => {
resolve(row);
});
});
},
posts: () => {
return new Promise((resolve) => {
db.all("SELECT * FROM posts", [], (err, rows) => {
resolve(rows);
});
});
}
}
};
const server = new ApolloServer({ typeDefs, resolvers });
server.listen().then(({ url }) => {
console.log(`🚀 GraphQL API 运行在 ${url}`);
});GraphQL 是一种极具灵活性的 API 设计方式,彻底改变了前后端数据交互模式。相比 REST,它让前端拥有了更大的自由度,避免了 “拿到一大堆没用数据” 和 “不得不发多个请求” 的问题。同时,它还支持实时订阅、数据合并等高级特性,让 API 更加智能。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。