MoyaX 最初是对 Moya 的分叉,是基于Moya,用Swift编写的网络抽象层,但经过多次重构,MoyaX 与 Moya 有很大的不同,包括:
enum
Request
和Response
以供高级使用[hidecontent type="logged" desc="隐藏内容:登录后可查看"]
但是 MoyaX 认为功能性和反应性支持应该成为扩展,所以在 MoyaX 稳定之前它们暂时被删除了。
只需添加pod 'MoyaX'
到您的 Podfile 即可!
然后运行pod install
。
Carthage 用户可以指向这个仓库
github "jasl/MoyaX"
使用 MoyaX 从定义一个目标开始——它可以是一个struct
,class
或一个enum
需要遵守Target
协议的。然后,您的应用程序的其余部分仅处理这些目标。目标看起来像:
// 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
}
}
您应该通过 访问 Targets 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
}
[/hidecontent]