IQAPIClient

模型驱动的 API 客户端

Build Status

IQAPIClient 允许我们发起 API 请求,并以您定义的模型对象形式返回响应。

要求

Platform iOS

语言 最低 iOS 目标 最低 Xcode 版本
IQAPIClient Swift iOS 10.0 Xcode 11

支持的 Swift 版本

5.0 及以上

安装

使用 CocoaPods 安装

CocoaPods

IQAPIClient 可通过 CocoaPods 获取。要安装它,只需将以下行添加到您的 Podfile 中

pod 'IQAPIClient'

或者,您可以根据 要求 中的 Swift 支持表选择您需要的版本

pod 'IQAPIClient', '1.0.0'

使用源代码安装

Github tag

拖放 将演示项目中的 IQAPIClient 目录到您的项目中

使用 Swift Package Manager 安装

Swift Package Manager (SPM) 是 Apple 的依赖管理工具。 现在 Xcode 11 中支持它。 因此,它可以用于所有 appleOS 类型的项目中。 它也可以与其他工具(如 CocoaPods 和 Carthage)一起使用。

要将 IQAPIClient 包安装到您的包中,请在 Package.swift 文件的 dependencies 部分添加对 IQAPIClient 的引用以及目标发布版本

import PackageDescription

let package = Package(
    name: "YOUR_PROJECT_NAME",
    products: [],
    dependencies: [
        .package(url: "https://github.com/hackiftekhar/IQAPIClient.git", from: "1.0.0")
    ]
)

通过 Xcode 安装 IQAPIClient 包

基本配置

在使用 IQAPIClient 之前,我们需要进行一些初始配置,例如设置您的 API 基础 URL 和默认标头等。您可以在您的 AppDelegate 中执行此操作。

        IQAPIClient.baseURL = URL(string: "https://www.example.com/api/v1")
        IQAPIClient.httpHeaders["Content-Type"] = "application/json"
        IQAPIClient.httpHeaders["Accept"] = "application/json"

配置我们的模型

现在假设您有一个 API 返回用户列表,并且您为此有一个 User 模型。

struct User {

    let id: Int

    let name: String

    let email: String?
}

现在首先,我们需要修改我们的模型以使其与 IQAPIClient 兼容。 为此,我们只需要使用 Decodable 协议确认我们的 User 模型即可。

// Now it's ready to be used with IQAPIClient
struct User: Decodable {

    let id: Int

    let name: String

    let email: String?
}

IQAPIClient 基本方法签名

Swift.Result 版本

static func sendRequest<Success>(
            path: String,
            method: HTTPMethod = .get,
            parameters: Parameters? = nil,
            completionHandler: @escaping
            (_ result: Swift.Result<Success, Error>) -> Void)

其中原生 Swift.Result 看起来像这样

enum Result<Success, Failure> where Failure: Error {
    case success(Success)	/// A success, storing a `Success` value.
    case failure(Failure)	/// A failure, storing a `Failure` value.
}

IQAPIClient.Result 版本

static func sendRequest<Success, Failure>(
            path: String,
            method: HTTPMethod = .get,
            parameters: Parameters? = nil,
            completionHandler: @escaping 
            (_ result: IQAPIClient.Result<Success, Failure>) -> Void)

其中 IQAPIClient.Result 看起来像这样

enum Result<Success, Failure> {
    case success(Success)	/// A success, storing a `Success` value.
    case failure(Failure)	/// A failure, storing a `Failure` value.
    case error(Error)		/// An error, storing an `Error` value.
}

使用 IQAPIClient 进行 API 调用

要获取用户列表,您可以使用 IQAPIClient 的几种方法。

方法 1:直接使用 sendRequest 方法 (Swift.Result 版本)

class ViewController: UIViewController {

    private func getUsersList() {
        //Result<[User], NSError> detects that the app is asking for array of User object
        IQAPIClient.sendRequest(path: "/users") { [weak self] (result: Swift.Result<[User], NSError>) in
            switch result {
            case .success(let users):
                self?.users = users
                self?.refreshUI()
            case .failure(let error):
                //Show error alert
                print(error.localizedDescription)
            }
        }
    }
}

方法 2:相同的请求,但使用 IQAPIClient.Result 版本

假设 APIMessage 看起来如下,并且当出现问题时,我们会收到这种响应

struct APIMessage: Decodable {
    let status: Bool
    let code: Int
    let message: String
}
class ViewController: UIViewController {

    private func getUsersList() {
        //Result<[User], NSError> detects that the app is asking for array of User object
        IQAPIClient.sendRequest(path: "/users") { [weak self] (result: Swift.Result<[User], APIMessage>) in
            switch result {
            case .success(let users):   //[User] object
                self?.users = users
                self?.refreshUI()
            case .failure(let message): //APIMessage object
                //Show failure alert
                print(message.code)
                print(message.message)
            case .error(let error):     //Error object
                //Show error alert
                print(error.localizedDescription)
            }
        }
    }
}

方法 2:将此调用移动到 IQAPIClient 扩展中的函数

extension IQAPIClient {

    @discardableResult
    static func getUsersList(completionHandler: @escaping (_ result: Swift.Result<User, NSError>) -> Void) -> DataRequest {
        return sendRequest(path: "/users", completionHandler: completionHandler)
    }
}

方法 3:如果您还没有模型,那么您也可以以字典数组的形式获取响应,如下所示:-

extension IQAPIClient {

    @discardableResult
    static func getUsersList(completionHandler: @escaping (_ result: Swift.Result<[[String:Any]], NSError>) -> Void) -> DataRequest {
        return sendRequest(path: "/users", completionHandler: completionHandler)
    }
}

class ViewController: UIViewController {

    private func getUsersList() {
        
        //Now use the getUsersList function
        IQAPIClient.getUsersList { [weak self] result in
            switch result {
            case .success(let users):
                self?.users = users
                self?.refreshUI()
            case .failure(let error):
                //Show error alert
                print(error.localizedDescription)
            }
        }
    }
}

高级配置

sendRequest 方法的高级参数

- successSound: Bool = false  //A success sound/vibration will be played on success response, you could use it when you create some records like saving something in the server.
- failedSound: Bool = false   //An error sound/vibration will be played on error 
- executeErroHandlerOnError: Bool = true  //This will also execute common error handler block on error to handle all error from a single place.

//TODO 添加示例

许可证

根据 MIT 许可证分发。

贡献

非常欢迎任何贡献! 您可以通过 GitHub 上的 pull request 和 issue 进行贡献。

作者

如果您想联系我,请给我发送电子邮件:hack.iftekhar@gmail.com