Restler
Restler框架是针对Swift最新版本特性和功能构建的。它的灵感来自用于构建Swift后端服务的Vapor库。我们喜欢函数式编程,因此您可以调用一系列链式函数来构建所需的请求。该框架的主要目标是提供最友好、最快的API请求接口。
内容列表
文档
我们认为README不是完整的文档的好地方,因此我们决定在框架仓库内部生成它。完整的文档您可以在文档文件夹中找到。如果您正在查找特定协议或类的描述,我们在这里列出了一些最重要的符号。
Restler
RestlerType - 它是主要的协议,当涉及到模拟或使用Restler的类实例时应该使用。
请求构建器
- RestlerBasicRequestBuilderType - 适用于所有HTTP方法。
- RestlerQueryRequestBuilderType - 适用于所有HTTP方法。
- RestlerBodyRequestBuilderType - 适用于所有HTTP方法。
- RestlerDownloadRequestBuilderType - 仅适用于GET。
- RestlerMultipartRequestBuilderType - 仅适用于POST。
- RestlerDecodableResponseRequestBuilderType - 适用于GET、POST、PUT、PATCH和DELETE(所有非HEAD)。
所有这些协议都在一个文件中定义:RestlerRequestBuilderType
请求
Restler.Request - Restler提供所有请求类型通用的类。
错误
- Restler.Error - Restler返回的错误。
- Restler.ErrorType - Restler可以自行解码的类型。每一种不同类型都会有一个
unknownError
。
错误解析器
- RestlerErrorParserType - ErrorParser类的公共协议。
- RestlerErrorDecodable - 要实现ErrorParser解码的对象的协议。
安装
这里很简单,如果您使用的是 Swift Package Manager,只需将其添加到依赖项中即可。
否则您可以使用 CocoaPods。如果使用,只需将其添加到您的 Podfile
中
...
pod 'Restler/Core'
...
重要,请用 /Core
指定! (自 v1.0 更改) 并在控制台中调用
pod install
将框架导入到项目中
import RestlerCore
然后调用它!
使用示例
错误解析器
如果您不希望在每次请求失败时解析相同的错误,只需直接将其添加到 Restler 对象的错误解析器中。
restler.errorParser.decode(ErrorToDecodeOnFailure.self)
如果您不再需要解码,请停止解码它。
restler.errorParser.stopDecoding(ErrorToDecodeOnFailure.self)
头部信息
设置头部值非常容易。只需将其作为字典设置即可
restler.header = [
.contentType: "application/json",
.cacheControl: "none",
"customKey": "value"
]
restler.header[.cacheControl] = nil
如果您在 "Authorization" 键中使用基本身份验证,只需将用户名和密码提供给头部即可
restler.header.setBasicAuthentication(username: "me", password: "password")
Restler 调用
GET 请求
Restler(baseURL: myBaseURL)
.get(Endpoint.myProfile) // 1
.query(anEncodableQueryObject) // 2
.failureDecode(ErrorToDecodeOnFailure.self) // 3
.setInHeader("myNewTemporaryToken", forKey: "token") // 4
.receive(on: .main) // 5
.decode(Profile.self) // 6
// 7
.subscribe(
onSuccess: { profile in // 8
updateProfile(with: profile)
},
onCompletion: { _ in // 9
hideLoadingIndicator()
})
- 对指定的端点发起 GET 请求。
- 将对象编码并放入 GET 请求的查询中。
- 如果发生错误,错误解析器会尝试解码指定的类型。
- 只为本次请求,在标题中设置指定键的值。
- 将完成处理程序调用到的分发队列设置为主队列。
- 成功响应时,解码配置文件对象。如果不是可选的,可以调用失败处理器。
- 从现在开始,我们正在操作请求,而不是请求构建器。
- 当Restler成功结束请求时调用的处理器。
- 无论结果如何,在请求完成后调用的处理器。
POST
Restler(baseURL: myBaseURL)
.post(Endpoint.myProfile) // 1
.body(anEncodableQueryObject) // 2
.failureDecode(ErrorToDecodeOnFailure.self)
.decode(Profile.self)
.subscribe(
onFailure: { error in // 3
print("\(error)")
},
onCompletion: { _ in
hideLoadingIndicator()
})
- 向给定的端点发送POST请求。
- 编码对象并将其放入请求的主体中。如果选择的方法不支持此操作,则忽略。
- 如果请求失败则调用的处理器。
其他
任何其他方法调用都与这两个非常相似,但如果有疑问,请创建一个问题。
Restler + Combine
- Restler方法
Restler(baseURL: myBaseURL)
.get("/profile") // 1
.decode(Profile.self) // 2
.publisher // 3
.catch { _ in Empty() } // 4
.assign(to: \.profile, on: self) // 5
.store(in: &subscriptions) // 6
- 对指定的端点发起 GET 请求。
- 解码
Profile
对象。 - 将请求对象转换为发布者,以便轻松地在代码中使用Combine。
- 处理抛出的错误。
- 将发布者的每个元素分配给对象上的一个属性。
- 将此类型的取消实例存入指定的集合。
- 更多的Combine方法
Restler(baseURL: myBaseURL)
.get(Endpoint.myProfile) // 1
.query(anEncodableQueryObject) // 2
.publisher()? // 3
.receive(on: DispatchQueue.main) // 4
.map(\.data) // 5
.decode(type: Profile.self, decoder: JSONDecoder()) // 6
.catch { _ in Empty() } // 7
.assign(to: \.profile, on: self) // 8
.store(in: &subscriptions) // 9
- 对指定的端点发起 GET 请求。
- 将对象编码并放入 GET 请求的查询中。
- 构建请求并返回Combine支持的发布者。
- 指定用于从发布者接收元素的调度器。在这种情况下是主队列。
- 从
DataTaskPublisher
获取数据对象。 - 解码
Profile
对象。 - 处理错误。
- 将发布者的每个元素分配给对象上的一个属性。
- 将此类型的取消实例存入指定的集合。
Restler + RxSwift
首先,您需要将RxRestler
添加到您的目标。您可以在SPM中简单地做到这一点。在CocoaPods中,您应在Podfile中添加
pod `Restler/Rx`
然后,将import RxRestler
添加到每个需要它的文件中。
Restler(baseURL: myBaseURL)
.get(Endpoint.myProfile)
.query(anEncodableQueryObject)
.receive(on: .main) // 1
.decode(Profile.self) // 2
.rx // 3
.subscribe( // 4
onSuccess: { print("This is my profile:", $0) },
onError: { print("This is an error:", $0) })
.disposed(by: bag) // 5
- 即使队列已经由RxSwift完成订阅,订阅处理程序仍然会在提供队列上被调用(使用此属性设置调度器可能会导致在接收响应和处理响应之间出现一些延迟,但处理程序将在提供的调度器上被调用)。
- 在成功响应后解析某些类型 - Void、Data 或某些自定义对象。
- 将请求移动到 Rx 使用。在这种情况下,它返回
Single<Profile>
。 - 这里我们调用了RxSwift函数。
- 请记住将
Disposable
添加到DisposeBag
中。如果bag
被注销,网络任务将自动取消。
贡献
如果您想为此框架做出贡献,只需在此处提交您的拉取请求。
如果您发现了任何错误,请将其在问题中提交。
如果您希望Restler执行其他操作,请创建一个带有功能请求的问题。
配置
- 克隆项目并在终端中打开项目的文件夹。
- 运行配置脚本:
./Scripts/configure.sh
- 在文件夹
Restler-Example/Restler-Example/Configuration
中填写配置文件,命名为Debug.xcconfig
,并填写所需信息。 - 在文件夹
Restler-Example
中打开项目。您可以从终端这样做:open Restler-Example/Restler-Example.xcodeproj
- 运行测试以确保一切正常工作。
代码风格检查
在将更改推送到存储库之前,运行命令 ./Scripts/pod_lib_lint.rb Restler.podspec
来检查 podspec。
发布
- 打开项目根目录。
cd Scripts/releaseTool
swift run ReleaseTool release ../..