一、概述
在创建 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 评论