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 包管理器 依赖关系。
否则你还可以使用 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
如果你在“授权”键中使用基本认证,只需将用户名和密码提供给头部即可。
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
。 - 在这里,我们调用已存在的 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 ../..