拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 GraphQL 和 REST 有什么不同?

GraphQL 和 REST 有什么不同?

白鹭 - 2022-03-07 2300 0 2

一、概述

在创建 Web 服务的应用程序时,我们支持可能会选择使用 REST 或 Graph 作为通信模式。虽然现在我们最有可能在 HTTP 上使用 JSON,但它们有不同的和优势。

在本本中,将比较图表和 REST。我们将创建一个产品数据库示例中的解决方案,在执行相同的客户端操作时不同 QL。

2. 示例服务

我们的示例服务将允许我们:

  • 创建稿草稿状态的产品

  • 更新产品详情

  • 获取产品列表

  • 获取我们产品的详细信息及其订单

让我们从使用 REST 创建应用程序开始。

3.休息

REST( Resource State Transfer)是一种超呈现REST主要媒体系统的架构风格。中的数据被称为资源。在这个例子中,资源中是“product”

3.1创建产品

要创建产品,我们将在 API 上使用POST方法:

curl -X POST -H "Content-Type:application/json" -d '
 {
 "name": "Watch",
 "description": "Special Swiss Watch",
 "status": "Draft",
 "currency": "USD",
 "price": null,
 "image_url": null,
 "video_url": null,
 "stock": null,
 "average_rating": null
 }' https://graphqlvsrest.com/product

结果,系统将创建一个新产品。

3.2更新产品

在 REST 中,我们通常使用PUT方法更新产品:

curl -X PUT -H "Content-Type:application/json" -d '
 {
 "name": "Watch",
 "description": "Special Swiss Watch",
 "status": "Draft",
 "currency": "USD",
 "price": 1200.0,
 "image_url": ["https://graphqlvsrest.com/imageurl/product-id"],
 "video_url": ["https://graphqlvsrest.com/videourl/product-id"],
 "stock": 10,
 "average_rating": 0.0
 }'
 https://graphqlvsrest.com/product/{product-id}

因此,{product-id}希望会有更新。

3.3获取产品列表

产品系列通常是一个GET操作,我们可以使用查询字符串来指定分页:

curl -X GET https://graphqlvsrest.com/product?size=10&page=0

第一个回应对好像:

{
 "id": 1,
 "name": "T-Shirt",
 "description": "Special beach T-Shirt",
 "status": Published,
 "currency": "USD",
 "price": 30.0,
 "image_url": ["https://graphqlvsrest.com/imageurl/1"],
 "video_url": ["https://graphqlvsrest.com/videourl/1"],
 "stock": 10,
 "average_rating": 3.5
 }

3.4通过订单获取产品

要获取产品及相关订单,我们使用之前的API产品列表,然后调用orde r以获取相关订单:

curl -X GET https://graphqlvsrest.com/order?product-id=1

第一个回应对好像:

{
 "id": 1,
 "product_id": 1,
 "customer_uuid": "de68a771-2fcc-4e6b-a05d-e30a8dd0d756",
 "status": "Delivered",
 "address": "43-F 12th Street",
 "creation_date": "Mon Jan 17 01:00:18 GST 2022"
 }

当通过product-id查询GET所有产品时,我们将把参数作为参数提供给所有产品。 。这与N + 1 Select Problem相关。

4.GraphQL

GraphQL 是一种用于 API 的查询语言,它自带一个运行时,使用现有的数据服务来完成查询。

使用查询查询和查询查询。

查询和变异都定义了一个模式。模式定义了可能的客户端请求和响应。

让我们使用 GraphQL Server 重新实现我们的示例。

4.1创建产品

让我们使用一个重要的传奇saveProduct

curl -X POST -H "Content-Type:application/json" -d'
 {
 "query": "mutation {saveProduct (
 product: {
 name: \"Bed-Side Lamp\",
 price: 24.0,
 status: \"Draft\",
 currency: \"USD\"
 }){ id name currency price status}
 }"
 }'
 https://graphqlvsrest.com/graphql

在这个saveProduct函数的所有内容中,圆圆内的输入类型都是schema。后面的大描述了服务器的字段

当我们运行时,我们应该期待一个选择的回应:

{
 "data": {
 "saveProduct": {
 "id": "12",
 "name": "Bed-Side Lamp",
 "currency": "USD",
 "price": 24.0,
 "status": "Draft"
 }
 }
 }

这个请求与使用 REST 发布版本的 POST 非常相似,尽管我们现在可以自定义响应。

4.2更新产品

可以使用另一个更改updateProduct来我们的产品:

curl -X POST -H "Content-Type:application/json" -d'
 {
 "query": "mutation {updateProduct (id:12
 product: {
 price: 14.0,
 status: \"Publish\"
 }){ id name currency price, status}
 }"
 }'
 https://graphqlvsrest.com/graphql

我们在回应中收到选择的字段:

{
 "data": {
 "updateProduct": {
 "id": "12",
 "name": "Bed-Side Lamp",
 "currency": "USD",
 "price": 14.0,
 "status": "Published"
 }
 }
 }

正如我们所见,提供了响应格式的图表QL

4.3获取产品列表

要从服务器获取数据,我们将使用查询:

curl -X POST -H "Content-Type:application/json" -d
 '{
 "query": "query {products(size:10,page:0){ id name status}}"
 }'
 https://graphqlvsrest.com/graphql

在这里,我们还描述了我们希望看到的结果页面:

{
 "data": {
 "products": [
 {
 "id": "1",
 "name": "T-Shirt",
 "status": "Published"
 },...
 ]
 }
 }

4.4.通过订单获取产品

使用 QL,我们可以要求 GraphQL 服务器将产品和单曲连接:

curl -X POST -H "Content-Type:application/json" -d
 '{
 "query": "query {product(id:1){ id name orders{customer_uuid address status creation_date}}}"
 }'
 https://graphqlvsrest.com/graphql

id在此中,我们获取1个产品的周边订单。这使我们能够在单独操作中请求,让我们查询响应:

{
 "data": {
 "product": {
 "id": "1",
 "name": "T-Shirt",
 "orders": [
 {
 "customer_uuid": "de68a771-2fcc-4e6b-a05d-e30a8dd0d756",
 "status": "Delivered",
 "address": "43-F 12th Street",
 "creation_date": "Mon Jan 17 01:00:18 GST 2022"
 }, ...
 ]
 }
 }
 }

正如我们在此处看到的,响应包含产品的详细信息和各自的订单。

为了使用 REST 的这一点,我们需要发送几个请求——第一个请求获取产品,第二个请求获取相应的订单。

5.比较

这些示例展示了 QL 如何减少客户端和服务器之间的,并允许客户端为响应提供一些格式规则。

服务器的数据源数据,这些数据的API在后面修改,但仍然需要执行客户端和客户端的报表来使用报表的执行任务。

让我们进一步比较这种方法。

5.1. 更好的性能

服务器有时间和有效请求类型的服务器。

在 REST 中,最终可能会发送多个所需的功能。这些多个是一个非常重要的请求。此外,我们将在响应可能包含客户端应用程序可能需要执行的操作数据。

GraphQL 可以避免昂贵的操作。我们通常可以使用 GraphQL 在所有请求中获取我们需要的数据

5.2灵活和动态的查询

GraphQL 允许和动态的查询:

  • 客户端应用程序请求必填字段

  • 别名可用于具有自定义键的字段

  • 客户端可以使用查询来管理结果顺序

  • 客户端可以更好地与 API 中的任何东西分开,因为没有不同版本的对象结构可以遵循

5.3.什么时候使用REST?

有什么办法可以在一个同类产品中应用 QL 甚至可能存在的同类产品。

在以下情况下,我们可以更喜欢 REST:

  • 我们的应用程序是资源驱动的,其中一个操作与资源天然关联非常直接且完全相关

  • 需要Web缓存,因为GraphQL本身并不支持它

  • 我们需要上传文件,因为 GraphQL 本身不支持它

六、结论

我们在这个方法中,我们比较了
如何比另一种方法讨论明显的优势。的要求将是在两者之间决定的力。有时,它们也可以共同选择。


标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *