简单图形ql客户端
sgqlc的Python项目详细描述
简介
此软件包提供易于使用的graphql 客户端。它由以下模块组成:
- sgqlc.types :在python中声明graphql,以生成和 解释查询。子模块 sgqlc.types.datetime 将 提供 datetime 和iso 8601的绑定,同时 sgqlc.types.relay 将公开 节点 , 页面信息 和 连接
- sgqlc.operation :使用声明的类型生成和 解释查询。
- sgqlc.endpoint :提供对graphql端点的访问,特别是 sgqlc.endpoint.http提供了使用 urllib.request.urlopen()
什么是graphql?
直接从http://graphql.org < Buff行情>
API的查询语言
graphql是一种api的查询语言,是实现 使用现有数据的查询。graphql提供了一个完整的 以及对api中的数据的可理解的描述,给出了 客户有权要求他们所需要的东西 更进一步,使随着时间的推移开发api变得更容易,并且 强大的开发工具。
它是Facebook根据他们的问题和解决方案创建的 休息 开发应用程序以使用它们的api。是公开的 宣布在 react.js conf 2015 从那以后就开始有吸引力了。现在有大牌 从rest转换到graphql: yelp 购物化 以及 github 杰出的 帖子 以解释它们为什么会改变。
与其他产品相比的优势列表:
- 内置模式,带有文档、强类型和 反省。不用了 招摇过市 或任何其他要播放的外部工具 有了它。实际上,graphql为 探索graphql端点: https://github.com/graphql/graphiql ;
- 只有你想要的字段。查询必须显式选择 字段是必需的,这就是您所得到的全部。如果有更多字段 添加到类型时,它们不会中断api,因为 字段不会返回给老客户,因为他们没有要求这样做 领域。这样可以更容易地保持api的稳定性,并避免 版本控制。标准rest通常在 结果,以及当要包含新字段时,一个新的api 添加版本(反映在url路径中);
- 一个请求中的所有数据。而不是导航超媒体驱动 restful服务,比如发现新的链接: {"ref"… 和 执行新的http请求,使用graphql指定嵌套 查询并让服务器完成整个导航。这个 大大减少延迟;
- 如果 您请求 {parent{child{info}} ,您将 接收json对象 {"parent":{"child":{"info":value}}
来自Github's 从rest迁移到graphql 人们可以在现实生活中看到这些:
$ curl -v https://api.github.com/orgs/github/members [ { "login": "...", "id": 1234, "avatar_url": "https://avatars3.githubusercontent.com/u/...", "gravatar_id": "", "url": "https://api.github.com/users/...", "html_url": "https://github.com/...", "followers_url": "https://api.github.com/users/.../followers", "following_url": "https://api.github.com/users/.../following{/other_user}", "gists_url": "https://api.github.com/users/.../gists{/gist_id}", "starred_url": "https://api.github.com/users/.../starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/.../subscriptions", "organizations_url": "https://api.github.com/users/.../orgs", "repos_url": "https://api.github.com/users/.../repos", "events_url": "https://api.github.com/users/.../events{/privacy}", "received_events_url": "https://api.github.com/users/.../received_events", "type": "User", "site_admin": true }, ... ]
带来整套会员信息但是你只想知道名字 和虚拟形象的网址:
query { organization(login:"github") { # select the organization members(first: 100) { # then select the organization's members edges { # edges + node: convention for paginated queries node { name avatarUrl } } } } }
同样,不要4个http请求:
curl -v https://api.github.com/repos/profusion/sgqlc/pulls/9 curl -v https://api.github.com/repos/profusion/sgqlc/pulls/9/commits curl -v https://api.github.com/repos/profusion/sgqlc/issues/9/comments curl -v https://api.github.com/repos/profusion/sgqlc/pulls/9/reviews
一个graphql查询会带来所有需要的信息,而 所需信息:
query { repository(owner: "profusion", name: "sgqlc") { pullRequest(number: 9) { commits(first: 10) { # commits of profusion/sgqlc PR #9 edges { node { commit { oid, message } } } } comments(first: 10) { # comments of profusion/sgqlc PR #9 edges { node { body author { login } } } } reviews(first: 10) { # reviews of profusion/sgqlc/ PR #9 edges { node { state } } } } } }
创建sgqlc的动机
如上所述,编写graphql查询非常简单
为了解释结果,
创建sgqlc的基本原理是什么?
-
graphql有它的领域特定语言(dsl),并且混合了两种语言
语言总是很痛苦的,就像sql+python、html+
python…能够用python编写python是非常重要的
更好。并不是说graphql命名约定更接近于
java/javascript,使用anameformat而不是python的
a_name_格式
-
对事物的描述有点痛苦:
d["repository"]["pullrequest"]["commits"]["edges"]["node"]
,
由于这些是有效的python标识符,我们最好编写:
存储库.pull_request.commits.edges.node
-
处理新的
标量
。graphql允许定义新的标量
类型,例如
日期
、
时间
和
日期时间
。通常这些是
序列化为ISO 8601字符串,用户必须在
申请。我们提供
sgqlc.types.datetime
生成
date time.date
,
datetime.time
和
日期时间.datetime
-
方便编写动态查询,包括嵌套查询。如图所示,
不过,graphql可用于一次性获取大量信息
如果您需要的(参数和字段)根据
变量,例如用户输入或缓存的数据,则需要
连接字符串以组成最终查询。这可能是个错误
容易和服务器可能会由于无效查询而阻止您。一些工具
通过在发送到之前在本地解析查询来"解决"
服务器。然而,通常凹痕是用螺丝拧紧的,并进行检查
是痛苦的。我们改变了这种方法:使用
sgqlc.operation.operation
并且它将始终生成有效的
可以打印并适当缩进的查询。加分
它可以用于以后将json结果解释为本机的
python对象。
-
在需要的时候提高可用性。例如
中继
发布了
光标连接规范
并得到广泛应用。要加载更多数据,需要扩展
以前的数据包含新获取的信息,更新的不仅仅是
节点和边,还有页面信息。这样做了
自动通过
sgqlc.types.relay.connection
未来的计划包括从graphql生成python类 架构,可以使用 自省查询。