我在公司电子金融中心JSC中担任开发人员。
我们的项目之一是哈萨克斯坦共和国的公共采购门户网站goszakup.gov.kz。
一年前,我们启动了一个大型项目-统一服务(OpenData)。
为了实现,使用了RestAPI方法。
今天,我将讨论我们服务的新版本以及与之合作的新界面。

我们已经开发并启动了6种开放数据服务:
- 参加者名册
- 不良供应商登记册
- 年度计划登记册
- 州公告 采购
- 批次登记
- 合同登记
哈萨克斯坦的许多公司已经在连接和接收有关这些服务的数据。
由于公司不需要编写不同的解析器来收集有关公共采购的数据,因此开放数据的推出使我们可以将数据库负载减少约40%。 完成一个困难的任务就足够了:)
- 编写访问令牌请求
- 在我们的门户网站goszakup.gov.kz/ru/developer/ows上阅读服务文档。
- 编写您的RestAPI客户端
统一服务-一种新方法
与解析站点相比,RestAPI可以更方便,更快捷地获取数据,但是标准的RestAPI不能为公司提供灵活性,并且无法与对象建立连接,您必须首先获取所有数据,然后才能建立它们之间的链接。
为了接收广告上的数据,RestAPI必须先请求公告注册,然后再请求批量注册,最后是计划注册。 这意味着要接收一个公告,必须完成至少3个请求,并且如果您需要接收有关50个广告的数据,则您至少需要101个对RestAPI的请求,前提是每个公告将有1手(1个接收50个广告,50个接收手,50个接收到)。收到计划积分)。
我们找到了一种将这一金额减少到一个请求的方法!
我们正在启动统一服务的第二版
-ows.goszakup.gov.kz/v2 。
除了扩展数据集,我们还扩展了使用API的能力。
现在可以通过RestAPI和新接口GraphQL获得数据。
ows.goszakup.gov.kz/v2/graphql
我不会描述什么是GraphQL,为此,您可以阅读
aliksend文章-
这是什么GraphQL?我将告诉您启动GraphQL后我们获得了哪些好处:
- 要求灵活性;
- 获取相关对象;
- 完整键入请求和响应;
- 新的数据搜索界面。
要求灵活性
通过一个简单的RestAPI请求,您可以获得预先设置的数据格式。
查询GraphQL时,将以所需的格式获取数据。
请求数据时,您自己确定所需数据的格式,例如ID和
合约编号
{ contract { id contract_number_sys } }
作为响应,我们仅获得以下数据:
{ "data": { "contract": [ { "id": 1, "contract_number_sys": "_" } ] } }
好吧,这样的查询是最容易实现GraphQL的。 公司有机会选择他们想要接收的数据,而我们不需要像使用RestAPI一样进行任何调整。 您仅获得所需的字段集。

检索相关对象
我们并没有仅仅通过允许部分选择数据来重复RestAPI的功能。
我们已经实现了GraphQL的第二个功能-对象关系。
如果您根据RestAPI接收数据,则为了接收合同和公司上的数据,合同中的客户首先需要从
参与者登记簿中获取数据,然后才从
合同登记簿中接收数据并在对象之间建立连接。
现在,使用GraphQL时,您不需要从参与者注册中完全接收数据,只需以您感兴趣的格式请求数据:
{ contract { id contract_number_sys customer { name_ru } } }
因此,通过一个请求,我们同时获得了客户的合同数据和公司数据:
{ "data": { "contract": [ { "id": 1, "contract_number_sys": "_", "customer" : { "name_ru": " " } } ] } }

而且已经实现了许多这样的关系,现在公司接收数据将大大减少接收数据的请求。 同时,不再需要确切猜测对象之间的相互关系,就可以接收完整的数据集以将它们彼此连接。
我试图部分说明我设法实现的连接结构。

键入请求和响应
许多SOAP请求的支持者总是把最重要的优点放在首位-数据键入。
与SOAP不同,RestAPI没有对其结构的描述,并且您事先也不知道什么数据类型。 但是GraphQL改变了一切。
现在,您可以在整个数据方案中向GraphQL请求数据,您将收到:
- 数据结构的完整描述;
- 描述哪个字段具有数据类型(Int,String,Boolean);
- 嵌套对象的描述和嵌套对象的字段结构;
- 详细说明,例如,每个领域都用俄语显示;
- 收到有关某个字段已收到带有说明的已弃用标志的通知。
我使用Insomnia REST客户端程序
-insomnia.rest与
GraphQL一起
使用使用GraphQL时,它将接收对象的整个结构,并在构造查询时提示。
我将给出一些屏幕截图作为示例。
1.自 该程序收到了完整的对象结构

2.提示每个字段的描述及其数据类型和描述

3.提示某些字段收到标志-不推荐使用

借助GraphQL的此功能,您可以全面了解要使用的字段和对象。

新的数据检索界面
最后我留下了最有趣的部分。
一切似乎都很酷,可以构建自己的数据结构,与其他对象建立连接,所有数据都被键入。 但是仍然缺少一些东西...
没有足够的机会搜索此数据。
从一开始,就使用请求本身中的参数实现了搜索格式:
{ trd_buy(ref_buy_status_id: 1) { name_kz name_ru } }
但是在这里我遇到了许多问题:
- 在具有大量搜索条件的情况下,查询变得根本无法阅读;
- 搜索数据以搜索一个字段的多个变体时,不可能定义数组。
为了简化查询的结构并扩大搜索能力,我实现了用于过滤数据的嵌套对象。
我们在请求中定义一个指示过滤对象的变量。
query($filter: TrdBuyFiltersInput){ trd_buy(filters: $filter) { name_kz name_ru } }
我们描述数据搜索参数本身:
{ "filter": { "ref_buy_status_id": [1, 2] } }
因此,我们将收到状态为1和2的所有广告。
在请求本身中,我们仅指示数据结构,并且所有搜索参数都进入参数的传输中,在这些参数中,我们已经可以根据几个条件传输数据数组以进行过滤。

此外,在GraphQL模式本身中,我们都对这种搜索对象进行了描述:

统一服务-2.0版:
服务工作:
- 参加者名册
- 公告登记处
- 合同登记
- 行为登记
- 批次登记
- 年度计划登记册
- 不良供应商登记册
我们推出了一项新功能,该功能极大地简化了我们API的使用,具有灵活的查询结构,并能够根据指定的条件搜索数据。
我们并没有失去获取数据的速度,只是因此减少了获取数据所需的请求数量。
我们能够在数据模式中警告禁用或重命名的字段。
我们计划进一步开发API,并支持对服务数据进行形态搜索。