MoyaSugar
Moya 的语法糖。
为什么这样使用?
Moya 是一个优雅的网络抽象层,使用 enum
抽象 API 端点。然而,当应用程序变大时,它将变得庞大。每当您添加一个端点时,您至少需要在 5 个地方编写代码:枚举情况、method
、path
、parameters
和 parameterEncoding
属性。 这会让您一次又一次地滚动查看代码。此外,如果您想设置不同的 HTTP 头字段,您需要自定义 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"
]
}
}
APIs
-
🔗 protocol SugarTargetType
- extension GitHubAPI: TargetType + extension GitHubAPI: SugarTargetType
-
🔗 var route: Route
返回包含HTTP方法和URL路径信息的
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头字段。这是如何在endpointClosure
中扩展目标的HTTP头字段的方法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 文件获取更多信息。