# 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 查询可以获取商品的所有信息,并且只返回我们指定的字段(例如 idnamepricedescription )。而在查询特定商品详情时,我们通过变量 $id 传递商品 ID,获取该商品的详细信息。

# 总结

REST API

  • 每个资源(例如商品列表、商品详情)有自己独立的 URL。
  • 获取数据时可能会获取到不需要的字段(过度获取),或者需要多次请求才能获取所有需要的数据(不足获取)。

GraphQL API

  • 只有一个端点,但可以通过灵活的查询语句获取不同的数据。
  • 可以精确获取所需的字段,避免过度获取或不足获取的情况。
  • 支持在一个请求中获取多个资源的数据。