使用GraphQL进行简洁的API设计

什么是GraphQL?

现实APP开发过程中,我们使用了大量的API,包括用于收集和存储数据的API。我们将软件构建为微服务,除非需要,否则我们不会直接公开每个服务。但是,由于API中需要获取大量数据,需要能够方便,安全地公开它。为了处理数据公开并使最终用户保持简单,我们使用GraphQL。

GraphQL是API的查询语言。它最初由Facebook开发供内部使用,然后在2015年开源的!

随着Facebook公开采购其GraphQL规范,它可以与大多数编程语言一起使用。GraphQL的主要客户端包括Apollo客户端和Relay。GraphQL服务器可用于多种语言,包括Haskell,JavaScript,Python,Ruby,Java,C#,Scala,Go,Elixir,Erlang,PHP,R和Clojure。

您可能使用了具有无数终结点的API,没有清楚地表明数据的实际外观,并且文档非常差。可悲的是,这可能是跨不同体系结构(REST,SOAP等)的常见问题。

GraphQL模式支持查询,修改,订阅。模式就像我们希望数据如何工作/看起来的蓝图。模式使您更容易理解可用的数据和格式。我们将创建一个基本模式进行查询。

首先,让我们定义查询和架构。我们将创建一个名为“getRestaurants”的查询,该查询将调用类型“ Restaurant”。

使用GraphQL进行简洁的API设计

我们已经创建了第一个查询。我们定义一个名为“getRestaurants”的查询,该查询返回“ Restaurant”类型。当GraphQL执行此查询时,它将查找相关的类型和解析器以验证数据。

让我们创建“餐厅”类型:

使用GraphQL进行简洁的API设计

在此示例中,我们说明“餐馆”类型具有以下条件:

名称必须为字符串。

category必须是字符串。

location必须是字符串。

operationTimes必须是字符串数组。

minSpend必须是有符号的32位整数。

感叹号表示该字段也是不可为空的,并且GraphQL服务承诺在查询该字段时始终返回一个值。

我们需要创建的最后一件事是解析器。

我们在这里所做的是返回一个对象,以针对架构进行验证。

使用GraphQL进行简洁的API设计

GraphQL是强类型的

查询API时,您想确切地知道您将获取哪些数据以及采用哪种格式。如果您要通过API获取特定商品的价格,并且它返回一个字符串,那么您可能会遇到问题…

制定严格的约束,清楚地描述可用数据的类型,对于确保您的应用程序按预期工作至关重要。GraphQL服务描述其类型,并根据该架构验证查询。

为什么GraphQL有助于清洁API设计

假设我们有一个客户希望加入送外卖服务。向用户展示相关餐厅有几个因素:

  1. 它必须在用户的特定半径内,比如3公里。
  2. 该餐厅必须当前开放并接受订单要求。
  3. 用户可以搜索所需的食物类型。

让我们开始为此构建一个基本的API。我们将通过查询基本的RESTful和GraphQL API,来区分2种方式的不同。

我们假设API已经知道用户的位置并且在交付范围之内。而且我们只显示2家餐厅。

RESTful API

接口:/ api /餐厅/汉堡

相应

使用GraphQL进行简洁的API设计

如果这是一个真实世界的API,那么这个JSON响应可能会非常庞大,因为可能一个地方会有很多的汉堡店。

用户请求获取出售汉堡的餐馆列表。在用户请求的这个阶段,用户仅需要一份在其所在地区出售汉堡并可以送货的餐馆清单。`menu`数组将不被使用。使用RESTful接口,您将获得所有这些数据,但是前端开发人员将不会使用它们。但是,它可能返回很多不会使用的数据(,这增加了等待时间,并增加了数据返回给用户的等待时间,特别是当我们的网速不给力的时候,这种情况很折磨人。

GraphQL API

接口:/ graphql

查询发送到GraphQL

使用GraphQL进行简洁的API设计

响应

使用GraphQL进行简洁的API设计

用户仍然请求获取出售汉堡的餐馆列表。当用户处于浏览阶段时,他们不在乎菜单上的内容。他们只想知道有哪些餐馆,以便他们决定从哪里用餐。此响应更加简洁。

GraphQL将仅返回您的要求-仅此而已。这意味着我们可以通过查询获得更多相关信息,而不会浪费用户的带宽和时间!

现在,假设API不知道用户的位置,但需要它来返回相关的餐厅。

RESTful API

接口:/ API /餐馆/位置/汉堡/

现在,我们需要一个不同的接口来查找在指定范围内出售汉堡的餐厅列表。我们可需要根据不同的情况,创建不同的接口列表,并且需要对保证API使用版本控制。 同时,他还会返回用户可能不需要的大量数据。

GraphQL API

接口:/ graphql

查询发送到GraphQL

使用GraphQL进行简洁的API设计

我们的GraphQL解析器将查询相关数据源并返回结果。可以看到,我们的接口没有发生变化,这是修改了查询逻辑,仅此而已,就是GraphQL的强大之处。

假设用户现在已经选择了一家餐馆并选择了几款汉堡,并准备确认他们的订单。这个时候,我们还需要显示有关其订单当前状态的进度数据(是否接单,是否送达等)。

显示其订单的当前状态需要几个步骤:

  • 当客户点击“跟踪订单”页面时,我们需要获取其订单ID。
  • 我们需要将该订单ID发送到负责跟踪订单的服务。
  • 然后,我们需要将状态返回给用户。

RESTful API

首先,我们需要发送请求以获取该订单的用户订单ID。

接口:/ api / orders / UID /

相应:

使用GraphQL进行简洁的API设计

然后,我们需要获取该orderNumber并发送一个请求以检查订单的状态。

接口:/ api / orders / state / orderNumber/

相应

使用GraphQL进行简洁的API设计

GraphQL API

接口:/ graphql

查询发送到GraphQL

使用GraphQL进行简洁的API设计

我们的GraphQL查询`order`将在后端调用其解析器,该解析器将获取订单号,然后向

接口 / api / orders / state / orderNumber发送请求。

响应

使用GraphQL进行简洁的API设计

GraphQL可以使前端从不必要的API调用和复杂性中抽象出来,使我们可以专注于其实际需要–简洁的数据。

使用GraphQL,我们可以简化客户端与API交互的方式。想象一下,我们允许用户从其智能手表订购显示信息的空间更少,并且(可能)更大的延迟。返回的数据仅应是该特定用户和客户端所需的数据。

当然,如果需要进行两次API调用才能返回数据,则GraphQL将无法神奇地仅发出一个请求。解析器仍将需要查询单独的数据源。但是,无论客户端是什么(手机,智能手表,冰箱?),客户端都将轻松得多。

RESTful服务流程示例

前端服务必须先查询两个单独的API,然后才能将信息返回给用户。如果用户的连接速度很慢,这可能会很痛苦。此流还将返回在餐馆上市阶段将永远不会使用的数据。

使用GraphQL进行简洁的API设计

GraphQL服务流程示例

前端服务只需要查询GraphQL服务。然后,GraphQL服务将具有解析器,以查询两个单独的RESTful服务,并解析并返回前端请求的数据。

使用GraphQL进行简洁的API设计

综上所述,有了GraphQL,我们就可以像使用SQL语言查询数据库一样,只需要列出我们需要查询的数据就行了,其它的交给数据库进行处理即可。


分享到:


相關文章: