MoyaX 的所有功能都已冻结,它还需要更多测试、文档和代码审查,请协助!
你是一位聪明开发者。你很可能使用 Alamofire 来抽象化对 NSURLSession 的访问以及你并不是特别关心的所有那些糟糕的细节。但然后,像许多聪明开发者一样,你编写了一些临时的网络抽象层。它们可能被称为“APIManager”或“NetworkModel”,但最终都会以失败告终。
所以 Moya 的基本思想是,我们想要一些足够的网络抽象层,可以充分封装直接调用 Alamofire。它应该足够简单,以便常用的功能易于实现,同时也应该足够全面,以便复杂的任务也易于实现。
此外,MoyaX 将测试存根视为一等公民,因此单元测试超级简单。
MoyaX 最初是 Moya 的分支,但随着许多重构,MoyaX 与 Moya 有很大不同,包括:
enum
Request
和 Response
但 MoyaX 认为功能性支持和响应式支持应成为扩展,因此它们目前已被移除,直到 MoyaX 稳定。
在 Example
目录中有一个示例项目。享受编程乐趣!
使用 MoyaX 从定义一个目标开始 - 它可能是一个需要符合 Target
协议的 struct
、class
或 enum
。然后,应用程序的其余部分只与这些目标处理有关。一个目标看起来像
// This struct defined Github show user API
struct GithubShowUser: Target {
// The username which should requesting
let name: String
// Constructor
init(name: String) {
self.name = name
}
// Required
var baseURL: NSURL {
return NSURL(string: "https://api.github.com")!
}
// Required
var path: String {
return "/users/\(name)"
}
// Optional, default is .GET
var method: HTTPMethod {
return .GET
}
// Optional, default is empty
var headerFields: [String: String] {
return [:]
}
// Optional, default is empty
var parameters: [String: AnyObject] {
return [:]
}
// Optional, default is .URL, means submitting parameters using `x-www-form-urlencoded`
var parameterEncoding: ParameterEncoding {
return .URL
}
}
你应该通过 MoyaXProvider
访问目标。
// Initialize a MoyaXProvider
let provider = MoyaXProvider()
// Request an API
provider.request(GithubShowUser(name: "jasl")) { response in
switch response {
// The server has response, 4xx and 5xx goes here too
case let .Response(response):
let data = response.data
let statusCode = response.statusCode
// Handle success here
// Network failure (connectivity or timeout), the request had cancelled or other unexpected errors goes here
case let .Incomplete(error):
// error is an enum
// Handle error here
}
}
上传 MultipartFormData 简单且高效。
struct UploadingTarget: Target {
let baseURL = NSURL(string: "https://httpbin.org")!
let path = "post"
// Remember, .GET doesn't support uploading.
let method = HTTPMethod.POST
// Encoding parameters by multipart/form-data
let parameterEncoding = ParameterEncoding.MultipartFormData
var parameters: [String: AnyObject] {
return [
// MoyaX provides some placeholders for MultipartFormData
"photo1": FileForMultipartFormData(fileURL: photoFileURL, filename: 'photo1.jpg', mimeType: 'image/jpeg'),
"photo2": DataForMultipartFormData(data: photoData, filename: 'photo2.jpg', mimeType: 'image/jpeg')
}
}
// Request a MultipartFormData target is no different with others.
provider.request(UploadingTarget()) { response in
// Handle response
}
MoyaX 采用 MIT 协议发布。更多详细信息请查看 LICENSE 文件。