# REST API 和 GraphQL API 的联系与区别
API(Application Programming Interface,应用编程接口),通俗点说,就是不同软件之间的交流工具。它让我们可以从服务器获取数据或者把数据发送给服务器。目前常用的两种常见 API 是 REST API 和 GraphQL API。
# REST API
REST API (Representational State Transfer API)是目前用得最多的一种 API 类型,它的原理很简单:通过 URL 来获取资源。
# REST API 怎么工作
我们可以把 REST API 想象成一个餐厅的菜单。你点什么菜(访问什么 URL),厨房(服务器)就会给你端上来对应的菜品(数据)。比如,你在浏览一个电商网站时,访问 /products
这个 URL,你可能就会看到所有的商品列表;访问 /products/123
,你就会看到编号为 123 的商品详情。
# REST API 的优缺点
优点:
- 容易理解:因为它是基于 HTTP 协议的,所以开发者几乎不需要额外学习就能上手。
- 普遍使用:大部分网站和应用都是用 REST API 来获取数据的,比如 Twitter、Facebook 等。
缺点:
- 可能获取太多或太少数据:举个例子,你只想知道某个商品的价格,但可能服务器会把这个商品的全部信息都给你,导致你获取了很多不需要的数据。反过来,有时候你想要多个商品的信息,但 REST API 可能让你得分几次请求才能拿到。
# GraphQL API
GraphQL 是 Facebook 开发的一种新型 API,它解决了 REST API 的一些不足之处。与其说它是一种 API,不如说它是一个 “点菜系统”,你可以告诉服务器你要什么样的数据,服务器就只会给你这些。
# GraphQL API 怎么工作
想象一下,你去餐厅点菜,你告诉服务员:“我只要牛排,不要配菜。” 服务员就只给你牛排。同样的,在 GraphQL 中,你可以向服务器请求:“我只要商品的名字和价格,不要其他信息。” 服务器就只会返回这些数据。
举个例子:
假设你想知道某个基因的信息。在 REST API 中,你可能需要多次请求不同的 URL,来分别获取基因的基本信息、遗传信息和其他相关数据。而在 GraphQL 中,你只需要一个请求,服务器会根据你的要求,返回所有你需要的数据,既方便又高效。
# GraphQL API 的优缺点
优点:
- 精确获取数据:你可以指定只要什么数据,避免不必要的流量消耗。
- 减少请求次数:你可以在一个请求中获取多个资源的数据,这对复杂的应用来说非常有用。
缺点:
- 学习成本较高:对于初学者来说,理解 GraphQL 的查询语言和概念可能有点挑战。
- 实现复杂:服务器端需要支持复杂的查询,这可能会增加开发和维护的难度。
非常抱歉误解了你的意思,下面我将以代码举例来介绍 REST API 和 GraphQL API 的不同。
# REST API 与 GraphQL API 的代码示例比较
# REST API 示例
假设我们有一个电商网站,需要获取商品的列表和商品的详细信息。我们可以使用 REST API 来实现这一需求。
获取商品列表的 REST API 请求:
import requests | |
# 获取商品列表 | |
response = requests.get('https://api.example.com/products') | |
# 打印返回的商品列表 | |
print(response.json()) |
获取特定商品详情的 REST API 请求:
import requests | |
# 获取 ID 为 123 的商品详情 | |
product_id = 123 | |
response = requests.get(f'https://api.example.com/products/{product_id}') | |
# 打印商品的详细信息 | |
print(response.json()) |
在这个 REST API 的例子中, /products
用于获取所有商品的列表,而 /products/123
用于获取某个特定商品的详情。每次请求只能获取特定资源的数据。
# GraphQL API 示例
同样的需求,我们使用 GraphQL API 来实现。我们可以在一个请求中获取商品列表和每个商品的详细信息,并且只获取我们感兴趣的字段。
获取商品信息的 GraphQL API 请求:
import requests | |
# GraphQL 查询字符串 | |
query = """ | |
{ | |
products { | |
id | |
name | |
price | |
description | |
} | |
} | |
""" | |
# 发送 POST 请求 | |
response = requests.post('https://api.example.com/graphql', json={'query': query}) | |
# 打印返回的商品信息 | |
print(response.json()) |
查询特定商品的详细信息:
import requests | |
# GraphQL 查询字符串,带有变量的查询 | |
query = """ | |
query getProduct($id: ID!) { | |
product(id: $id) { | |
id | |
name | |
price | |
description | |
stock | |
} | |
} | |
""" | |
# 定义查询的变量 | |
variables = {'id': 123} | |
# 发送 POST 请求,包含查询和变量 | |
response = requests.post('https://api.example.com/graphql', json={'query': query, 'variables': variables}) | |
# 打印特定商品的详细信息 | |
print(response.json()) |
在 GraphQL API 的例子中, products
查询可以获取商品的所有信息,并且只返回我们指定的字段(例如 id
、 name
、 price
和 description
)。而在查询特定商品详情时,我们通过变量 $id
传递商品 ID,获取该商品的详细信息。
# 总结
REST API:
- 每个资源(例如商品列表、商品详情)有自己独立的 URL。
- 获取数据时可能会获取到不需要的字段(过度获取),或者需要多次请求才能获取所有需要的数据(不足获取)。
GraphQL API:
- 只有一个端点,但可以通过灵活的查询语句获取不同的数据。
- 可以精确获取所需的字段,避免过度获取或不足获取的情况。
- 支持在一个请求中获取多个资源的数据。