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
- }
- }