Moya 的语法糖。
Moya 是一个优雅的网络抽象层,它使用 enum
优雅地抽象 API 端点。但是,当应用程序变得越来越大时,它会变得非常庞大。 每当你添加一个端点时,你至少应该在 5 个地方编写代码:枚举 case,method
,path
,parameters
和 parameterEncoding
属性。 这会让你一遍又一遍地向下滚动。此外,如果您想设置不同的 HTTP header fields,则应自定义 MoyaProvider
的 endpointClosure
。
如果您像我一样懒惰,那么 MoyaSugar 适合您。
忘记 method
,path
,parameters
,parameterEncoding
和 endpointClosure
。使用 route
,params
,httpHeaderFields
代替。
extension MyService: SugarTargetType {
var route: Route {
return .get("/me")
}
var params: Parameters? {
return JSONEncoding() => [
"username": "devxoul",
"password": "****",
]
}
var headers: [String: String]? {
return ["Accept": "application/json"]
}
}
使用 MoyaSugarProvider
代替 MoyaProvider
。
let provider = MoyaSugarProvider<MyService>()
let provider = RxMoyaSugarProvider<MyService>() // If you're using Moya/RxSwift
import Moya
import Moyasugar
enum GitHubAPI {
case url(String)
case userRepos(owner: String)
case createIssue(owner: String, repo: String, title: String, body: String?)
case editIssue(owner: String, repo: String, number: Int, title: String?, body: String?)
}
extension GitHubAPI : SugarTargetType {
/// method + path
var route: Route {
switch self {
case .url(let urlString):
return .get(urlString)
case .userRepos(let owner):
return .get("/users/\(owner)/repos")
case .createIssue(let owner, let repo, _, _):
return .post("/repos/\(owner)/\(repo)/issues")
case .editIssue(let owner, let repo, let number, _, _):
return .patch("/repos/\(owner)/\(repo)/issues/\(number)")
}
}
// override default url building behavior
var url: URL {
switch self {
case .url(let urlString):
return URL(string: urlString)!
default:
return self.defaultURL
}
}
/// encoding + parameters
var params: Parameters? {
switch self {
case .url:
return nil
case .userRepos:
return nil
case .createIssue(_, _, let title, let body):
return JSONEncoding() => [
"title": title,
"body": body,
]
case .editIssue(_, _, _, let title, let body):
// Use `URLEncoding()` as default when not specified
return [
"title": title,
"body": body,
]
}
}
var headers: [String: String]? {
return [
"Accept": "application/json"
]
}
}
🔗 protocol SugarTargetType
- extension GitHubAPI: TargetType
+ extension GitHubAPI: SugarTargetType
🔗 var route: Route
返回包含 HTTP method 和 URL path 信息的 Route
。
- var method: Method { get }
- var path: String { get }
+ var route: Route { get }
示例
var route: Route {
return .get("/me")
}
🔗 var url: URL
返回请求 URL。 默认情况下,它返回 defaultURL
,它是 baseURL
和 path
的组合。 实现此属性以返回自定义 url。 有关详细信息,请参见 #6。
🔗 var params: Parameters?
返回包含参数编码和值的 Parameters
。
- var parameters: [String: Any]? { get }
+ var params: Parameters? { get }
示例
var params: Parameters? {
return JSONEncoding() => [
"username": "devxoul",
"password": "****",
]
}
注意:如果使用 endpointClosure
参数初始化 MoyaSugarProvider
,则将使用 endpointClosure
的 HTTP header fields。 这是在 endpointClosure
中扩展目标 HTTP header fields 的方法。
let endpointClosure: (GitHubAPI) -> Endpoint<GitHubAPI> = { target in
let defaultEndpoint = MoyaProvider.defaultEndpointMapping(for: target)
return defaultEndpoint
.adding(newHTTPHeaderFields: ["Authorization": "MySecretToken"])
}
与 Moya 相同
使用 CocoaPods:
pod 'MoyaSugar'
pod 'MoyaSugar/RxSwift' # Use with RxSwift
MoyaSugar 目前不支持 Carthage。
$ TEST=1 swift package generate-xcodeproj
$ open MoyaSugar.xcodeproj
MoyaSugar 基于 MIT 许可证。 有关更多信息,请参见 LICENSE 文件。