GraphQL iOS(Swift)配置- Apollo集成

GraphQL是什么?

GraphQL 是一种用于 API 的查询语言(区别于RESTful API),可以使得客户端能够准确地获得它需要的数据,没有任何冗余,最早是由Facebook在2012年使用,2015年进行了开源。
我使用下来的感受是,在iOS端做数据请求的时候,更像是在服务端用查询语句查询数据库,需要什么样的返回结果,都可以通过修改语句来实现。

优点:

1.请求数据无冗余。向你的 API 发出一个 GraphQL 请求就能准确获得你想要的数据,请求的数据都可由客户端控制的,返回的结果都是可预测的结果。
2.获取多个资源只用一个请求。REST API 请求多个资源时得需请求多个 API,而 GraphQL 可以通过一次请求就获取你所需的数据。

缺点:

1.使用 GraphQL 的APP还不是很常见,网上相关的技术讨论不多,遇到问题了需要自己花时间摸索。增加了学习时间成本以及其他人的接手成本。
2.使用需要集成三方框架,例如Apollo、SwiftGraphQL、GraphQLiOS(Objective-C使用)等。
3.需要由客户端来完成请求数据的语句,而不是简单的向API传递参数。

GraphQL官方文档:https://graphql.cn

Apollo是什么?

Apollo是一个GraphQL官方推荐的第三方工具,方便用户集成使用GraphQL。

Apollo官方文档:https://www.apollographql.com/docs

集成方法:
集成Apollo:

通过CocoaPods去集成Apollo(也可以通过Swift Package Manager、Carthage等其他方式集成,可参考Apollo官方文档)
在podfile文件中中添加 pod "Apollo",然后pod install,把Apollo相关的库集成到项目中。

截屏.png
下载schema文件

schema文件是从服务端下载下来的模版,用来校验客户端的请求。

2.在项目TARGETS的Build Phases栏目下
按截图顺序点击加号,选择 New Run Script Phase。


截屏.png

把名称修改为Apollo CLI,并移动到Compile Sources上面。


截屏png

在Apollo CLI中复制粘贴下面这段代码,用来下载服务器的schema.json文件(实际使用时,地址改成自己的服务器地址)。

SCRIPT_PATH="${PODS_ROOT}/Apollo/scripts"
cd "${SRCROOT}/${TARGET_NAME}"
"${SCRIPT_PATH}"/run-bundled-codegen.sh schema:download --endpoint="https://n1kqy.sse.codesandbox.io/"
截屏.png

然后编译项目,会生成一个schema.json 文件。把这个文件Add Files 到你的项目中,之后要把这个文件,和后面要说的.graphql文件,还有最后生成的API.swift文件放在同一项目的目录下(不是有.xcodeproj和.xcworkspace的目录)。

截屏.png

这个schema文件是从你的服务器或者Apollo Studio Sandbox下载的(上面脚本里的地址就是这个方式,Sandbox是个在线调试工具,地址:https://n1kqy.sse.codesandbox.io/
)。schema是服务器上所有的可用的查询语句和数据类型的模版,相当于保存在客户端的一个协议。通过这个Apollo会校验这个请求是否可行。

创建.graghql文件

.graghql文件是用来放置请求语句的文件。
在Xcode里,新建一个空文件模板,命名为 LaunchList.graphql,将其保存在与schema.json文件相同的级别目录,将请求语句放在此文件里。

下面这个是sandbox的测试语句,复制到 LaunchList.graphql中:

query LaunchList {
  launches {
    cursor
    hasMore
    launches {
      id
      site
    }
  }
}
截图.png
生成API.swift文件

在刚刚添加脚本的地方把最后一行注释掉(下载完schema后就不需要了),换成下面一段生成API的代码。

"${SCRIPT_PATH}"/run-bundled-codegen.sh codegen:generate --target=swift --includes=./**/*.graphql --localSchemaFile="schema.json" API.swift
截图.jpg

然后编译项目,编译之后会生成一个API.swift文件,把它拖到Xcode中勾选Add to target。现在目录中就会有schema、LaunchList、API这三个文件了。


截图.jpg

打开API.swift文件,会看到里面的内容和LaunchList中的请求语句是匹配的。如果在LaunchList.graphql中删除id属性,再次编译,API.swift文件里的id也会不见。这样Apollo就集成好了。

使用方法:

用下面这段代码,就可以进行数据请求了。

class Network {
  static let shared = Network() 
    
  private(set) lazy var apollo = ApolloClient(url: URL(string: "https://n1kqy.sse.codesandbox.io/")!)
}

Network.shared.apollo.fetch(query: LaunchListQuery()) { result in
  switch result {
  case .success(let graphQLResult):
    print("Success! Result: \(graphQLResult)")
  case .failure(let error):
    print("Failure! Error: \(error)")
  }
}

实际使用的时候要把地址换成自己服务器,LaunchList.graphql中的语句按自己的需要修改。API文件里的内容不需要修改,每次运行都会根据.graphql和schema自动更新的。

这样,就完成了GraphQL和Apollo的简单配置和使用,更多的操作可以参照官方文档。
GraphQL官方文档:https://graphql.cn
Apollo官方文档:https://www.apollographql.com/docs

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容