Swift中优雅的网络请求
// 1.定一个enum
enum MyService {
xxxx
case showUser(id: Int)
xxx
}
// 2.扩展这个enum,符合 TargetType
extension MyService: TargetType {
var baseURL: URL { return URL(string: "https://api.myservice.com")! }
var path: String {
switch self {
case .showUser(let id), .updateUser(let id, _, _):
return "/users/\(id)"
}
}
var method: Moya.Method {
switch self {
case .zen, .showUser, .showAccounts:
return .get
case .createUser, .updateUser:
return .post
}
}
var task: Task {
switch self {
case .zen, .showUser, .showAccounts: // Send no parameters return .requestPlaincase let .updateUser(_, firstName, lastName): // Always sends parameters in URL, regardless of which HTTP method is used return .requestParameters(parameters: ["first_name": firstName, "last_name": lastName], encoding: URLEncoding.queryString)
return .requestPlain
}
}
var headers: [String: String]? {
return ["Content-type": "application/json"]
}
}
// 3.用起来
let provider = MoyaProvider<MyService>()
provider.request(.createUser(firstName: "James", lastName: "Potter")) { result in
// do something with the result (read on for more details)
}
// rxSwift 用法
provider.rx.request(.zen).subscribe { event in
switch event {
case .success(let response):
// do something with the data
case .error(let error):
// handle the error
}
}