使用 GraphQL 的最快方式
功能
AutoGraph 是一个 Swift 客户端框架,用于使用 GraphQL 发送请求并将响应映射到强类型模型中。模型可以用任何 Decodable
类型表示。AutoGraph 严重依赖 Swift 的类型安全性来驱动它,从而产生更安全、编译时检查的代码。
要求
Swift 5.3.2
- Swift 5.2 iOS 10 - 使用版本
0.14.7
- Swift 5.1.3 iOS 10 - 使用版本
0.11.1
- Swift 5.0 iOS 8 - 使用版本
0.10.0
- Swift 5.0 pre Decodable - 使用版本
0.8.0
- Swift 4.2+ - 使用版本
0.7.0
。 - Swift 4.1.2 - 使用版本
0.5.1
。
平台
- iOS 10.0+
- tvOS
- watchOS
- macOS 10.12+
- Linux
安装
CocoaPods
platform :ios, '10.0'
use_frameworks!
pod 'AutoGraph'
Swift Package Manager (SPM)
dependencies: [
.package(url: "https://github.com/remind101/AutoGraph.git", .upToNextMinor(from: "0.14.1"))
]
代码生成
代码生成目前处于早期alpha阶段。如果您有兴趣进行测试,请提出询问。
数据库
更新
之前本项目会通过数据库映射库直接映射到任何任意数据库。在实践中,我们发现通过Codable将映射到纯结构体更简单,并且当与代码生成结合时提供了更多的灵活性。如果您仍想继续以旧方式直接映射到数据库,请使用版本0.8.0
。从现在起,我们正在探索不同的代码生成方法,使其能够在幕后实现灵活的代码生成数据库缓存。我们希望在未来开源这些工作,敬请关注。
查询构建器
AutoGraph 包含一个 GraphQL 查询构建器,可以以类型安全的方式构建查询。但是,使用查询构建器不是必需的;任何继承自 GraphQLQuery
的对象都可以作为查询。默认情况下,String
继承了这个属性。
查询示例
Raw GraphQL AutoGraph
----------- ---------
query MyCoolQuery { AutoGraphQL.Operation(type: .query, name: "MyCoolQuery", fields: [
user { Object(name: "user", fields: [
favorite_authors { Object(name: "favorite_authors", fields: [,
uuid "uuid",
name "name"
} ]),
uuid "uuid",
signature "signature"
} ])
}
变更示例
Raw GraphQL
-----------
mutation MyCoolMutation {
updateFavoriteAuthor(uuid: "long_id", input: { name: "My Cool Name" })
{
favorite_author {
uuid
name
}
}
}
AutoGraph
---------
AutoGraphQL.Operation(type: .mutation, name: "MyCoolMutation", fields: [
Object(
name: "updateFavoriteAuthor",
arguments: [ // Continues "updateFavoriteAuthor".
"uuid" : "long_id",
"input" : [
"name" : "My Cool Class"
]
],
fields: [
Object(
name: "favorite_author",
fields: [
"uuid",
"name"
])
]
])
支持
订阅
AutoGraph 现在支持使用:graphql-ws
协议进行订阅。这与 Apollo GraphQL 服务器使用的协议相同,这意味着订阅将适用于 Apollo 服务器。
let url = URL(string: "wss.mygraphql.com/subscriptions")!
let webSocketClient = try WebSocketClient(url: url)
webSocketClient.delegate = self // Allows the user to inspect errors and events as they arrive.
let client = try AlamofireClient(url: AutoGraph.localHost,
session: Session(configuration: MockURLProtocol.sessionConfiguration(),
interceptor: AuthHandler()))
let autoGraph = AutoGraph(client: client, webSocketClient: webSocketClient)
let request = FilmSubscriptionRequest()
let subscriber = self.subject.subscribe(request) { (result) in
switch result {
case .success(let object): // Handle new object.
case .failure(let error): // Handle error
}
}
// Sometime later...
try autoGraph.unsubscribe(subscriber: subscriber!)
为类型安全模型提供可解码功能
AutoGraph 完全依赖 Decodable 将 GraphQL JSON 响应映射到数据模型。只需让模型符合 Decodable
即可!
JSONValue 用于类型安全的 JSON
在幕后,AutoGraph 使用 JSONValue 进行类型安全的 JSON 处理。您可自由导入以满足您的需求。
多线程
AutoGraph 在主线程上执行所有网络请求和映射。由于 Request
最终会将整个模型返回给主线程的调用者,因此在使用模型类型时需要考虑线程安全性。因此,建议使用不可变的 struct
类型作为模型。
网络库
AutoGraph 目前依赖于 Alamofire 进行网络操作。然而,这并不是一个硬性要求。鼓励对此提交拉取请求!
用法
请求协议
- 创建一个符合请求协议的类。您还可以扩展现有类来符合此协议。请求是一个用于通过 AutoGraph 发送 GraphQL 请求的基协议。它提供了以下参数。
queryDocument
- 要发送的查询。您可以使用查询构建器或字符串。variables
- 需要与查询一起发送的变量。接受Dictionary
。rootKeyPath
- 定义从哪个位置开始映射数据。空字符串(""
)将从 JSON 的根开始映射。- 必须提供
associatedtype SerializedObject: Decodable
来告诉 AutoGraph 要转换到的数据模型。 - 提供了一组方法通知请求其在生命周期的位置。
class FilmRequest: Request {
/*
query film {
film(id: "ZmlsbXM6MQ==") {
id
title
episodeID
director
openingCrawl
}
}
*/
let query = Operation(type: .query,
name: "film",
fields: [
Object(name: "film",
alias: nil,
arguments: ["id" : "ZmlsbXM6MQ=="],
fields: [
"id", // May use string literal or Scalar.
Scalar(name: "title", alias: nil),
Scalar(name: "episodeID", alias: nil),
Scalar(name: "director", alias: nil),
Scalar(name: "openingCrawl", alias: nil)])
])
let variables: [AnyHashable : Any]? = nil
let rootKeyPath: String = "data.film"
public func willSend() throws { }
public func didFinishRequest(response: HTTPURLResponse?, json: JSONValue) throws { }
public func didFinish(result: Result<Film, Error>) throws { }
}
发送
Swift
- 在AutoGraph上调用send方法
autoGraph.send(request, completion: { [weak self] result in ... }
- 处理响应
- result是一个泛型枚举Result<SerializedObject, Error>,包含成功和失败两种情况。
Objective-C
由于AutoGraph使用了关联类型和泛型,因此通过Objective-C直接发送请求不可行。可以从Swift中构建一个或多个桥梁到Objective-C以发送请求。
贡献
- 如果您遇到任何问题,请创建一个问题。
欢迎拉取请求!
- 创建一个问题,描述要添加的功能或解决的问题。管理员将尽快回复,讨论添加事宜。
- 如果您愿意,可以立即开始工作,通过添加问题帮助他人了解正在进行的工作,并促进讨论。
- 从项目分支,并提交一个拉取请求。请在拉取请求中包含新代码的测试和解决问题说明。管理员将审查您的代码,在合并之前予以批准。
- 确保LinuxTests更新
swift test --generate-linuxmain
- 如果您在命令行构建时遇到类似此错误的信息“无法构建Objective-C模块”,请尝试将命令前缀为
xcrun -sdk macosx
。
授权
MIT开源许可证 (MIT)
版权所有 (c) 2017-至今 Remind101
任何希望获取本软件及其相关文档副本("软件")的人,无论用途如何,均可免费使用该软件,不受任何限制,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本的权利,允许向获取软件的人提供此类副本,前提是必须遵守以下条件
必须包含上述版权声明和本许可声明在软件的所有副本或实质性部分中。
软件按“原样”提供,不提供任何形式的保证,明示或暗示,包括但不限于适销性、针对特定用途的适用性和非侵权保证。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任负责,不论是由于合同行为、侵权行为或其他行为,以及软件或其使用、或其他处理导致或与之有关的任何损害或损失。