一、概述
在创建 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/graphqlid在此中,我们获取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 评论