QuickApi 1.0.1

QuickApi 1.0.1

ferhanakkan 维护。



QuickApi 1.0.1

  • Ferhan Akkan

QuickApi

QuickApi 允许您在不处理解码操作的情况下在应用中使用多个 API。除此之外,它还允许您以简化的方式解决错误处理、401 未授权处理、状态码处理等问题。QuickApi 支持 GET、POST、DELETE、PUT、PATCH 以及多部分请求。

Version License Platform

特性

  • 支持 3 个不同的 API 和自定义请求。
  • 支持多部分请求的 3 个不同的 API 和自定义请求。
  • 响应对象将自动解码
  • 请求重试支持
  • 错误处理
  • HTTP 报头处理
  • 状态码处理
  • 未授权处理

内容

要求

  • iOS 11+
  • Swift 5+
  • Xcode 10+

安装

CocoaPods

Jake 可通过 CocoaPods 获取。要安装它,只需将以下行添加到 Podfile 文件中

pod 'QuickApi'

Swift 包管理器

  1. 文件 > Swift 包 > 添加包依赖
  2. 添加 https://github.com/ferhanakkan/QuickApi.git

或者

更新 Package.swift 文件中的 dependencies

dependencies: [
    .package(url: "https://github.com/ferhanakkan/QuickApi.git", .upToNextMajor(from: "1.0.0"))
]

用法

函数

一些用于设置 QuickApi 的函数。

  // Common settings for General and Multipart requests.
  
  Quick.shared.cancelAllRequests() // Cancel all requests.
  Quick.shared.showResponseInDebug(_ isEnable: Bool) // It allows the incoming response to be seen on the debug.
  Quick.shared.setTimeOut(_ time: Int) // Sets the timeout for the discarded request.
  Quick.shared.setMaxNumberOfRetry(_ count: Int) // It determines how many times it will be repeated if the request is unsuccessful.
  
  Quick.shared.setApiBaseUrlWith(apiType: ApiTypes, apiUrl: String) // Sets api url.
  Quick.shared.setCustomErrorManager(delegate: ErrorCustomizationProtocol) // Set error delegate for network requests.
  Quick.shared.setHeaderCompletion(delegate: HttpCustomizationProtocols)  // Set header delegate for network requests.
  Quick.shared.setUnauthorized(delegate: UnauthorizedCustomizationProtocol)  // Set unauthorized delegate for network requests.
  Quick.shared.setStatusCodeHandler(delegate: StatusCodeHandlerProtocol)  // Set status delegate for network requests.
  
  Quick.shared.get(url: String, parameters: Parameters? = nil, decodeObject: T.Type, apiType: ApiTypes = .primary, completion: @escaping GenericResponseCompletion<T>)   // Get
  Quick.shared.post(url: String, parameters: Parameters? = nil, decodeObject: T.Type, apiType: ApiTypes = .primary, completion: @escaping GenericResponseCompletion<T>)   // Post
  Quick.shared.put(url: String, parameters: Parameters? = nil, decodeObject: T.Type, apiType: ApiTypes = .primary, completion: @escaping GenericResponseCompletion<T>)   // Put
  Quick.shared.patch(url: String, parameters: Parameters? = nil, decodeObject: T.Type, apiType: ApiTypes = .primary, completion: @escaping GenericResponseCompletion<T>)   // Patch
  Quick.shared.delete(url: String, parameters: Parameters? = nil, decodeObject: T.Type, apiType: ApiTypes = .primary, completion: @escaping GenericResponseCompletion<T>)   // Delete
  Quick.shared.customRequest(full: String, header: HTTPHeaders? = nil, method: HTTPMethod, parameters: Parameters?, decodeObject: T.Type, completion: @escaping GenericResponseCompletion<T>) // Custom request you can create request as you wish.
  
  
  Quick.shared.setApiBaseUrlWithForMultipart(apiType: ApiTypes, apiUrl: String) // Sets api url for multipart.
  Quick.shared.setCustomErrorManagerForMultipart(delegate: ErrorCustomizationProtocol) // Set error delegate for network requests for multipart.
  Quick.shared.setHeaderCompletionorMultipart(delegate: HttpCustomizationProtocols) // Set header delegate for network requests for multipart.
  Quick.shared.setUnauthorizedorMultipart(delegate: UnauthorizedCustomizationProtocol) // Set unauthorized delegate for network requests for multipart.
  Quick.shared.setStatusCodeHandlerorMultipart(delegate: StatusCodeHandlerProtocol)  // Set status delegate for network requests for multipart.
  
  
  Quick.shared.upload(url: String, method: HTTPMethod, parameters: [String: Any], datas: [MultipartDataModel], decodeObject: T.Type, apiType: ApiTypes, completion: @escaping GenericResponseCompletion<T>) // Multipart
  Quick.shared.customMultipartUploadRequest(fullUrl: String, header: HTTPHeaders, method: HTTPMethod, parameters: [String: Any], datas: [MultipartDataModel], decodeObject: T.Type, completion: @escaping GenericResponseCompletion<T>)  // You can create multipart request as you wish.

快速开始

import UIKit
import QuickApi

struct TestApiResponse: Codable {
    var id: Int
    var title: String
    var body: String
    var userId: Int
}

class TestController: UIViewController {

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        
        Quick.shared.setMaxNumberOfRetry(3)
        Quick.shared.setTimeOut(10)
        Quick.shared.showResponseInDebug(true)
        
        Quick.shared.customRequest(full: "https://www.anyapi.com/endPoint",
                                   method: .get,
                                   parameters: ["paramName" : "param"],
                                   decodeObject: OpenWeatherResponse.self) { result in
          switch result {
          case .success(let value):
            print(value)
          case .failure(let error):
            print(error.statusCode ?? "")
            print(error.json ?? "")
          }
        }
    }
}

自定义请求

import UIKit
import QuickApi

struct TestApiResponse: Codable {
    var id: Int
    var title: String
    var body: String
    var userId: Int
}

class TestController: UIViewController {

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        
        Quick.shared.setMaxNumberOfRetry(3)
        Quick.shared.setTimeOut(10)
        Quick.shared.showResponseInDebug(true)
        
        Quick.shared.customRequest(full: "https://www.anyapi.com/endPoint",
                                   method: .get,
                                   parameters: ["paramName" : "param"],
                                   decodeObject: OpenWeatherResponse.self) { result in
          switch result {
          case .success(let value):
            print(value)
          case .failure(let error):
            print(error.statusCode ?? "")
            print(error.json ?? "")
          }
        }
    }
}

QuickApi 错误对象

struct QuickError<T: Decodable>: Error {
  public let alamofireError: AFError //When error occured in request you can get alamofire error as usual.
  public let response: T? // Your decode object if decoding avaliable.
  public let customErrorMessage: Any? // Custom error message which you want to get from json when error occured.
  public let json: [String : Any]? // Json response .
  public let data: Data? // Response data.
  public let statusCode: Int? // Status code of request.
}

错误处理

在使用 QuickApi 获取响应模型之外的参数时,设置 setCustomErrorManager(delegate: ErrorCustomizationProtocol) 和 setCustomErrorManagerForMultipart(delegate: ErrorCustomizationProtocol) 协议。将 ErrorCustomizationProtocol 协议添加到您的类中。选择要从 JSON 中接收的参数,当您的调用请求失败时,您的参数将出现在错误对象中。如果您愿意,您可以在您想要的参数从 api 来时进行必要的操作。这是可选的。

import QuickApi

class QuickSettings: ErrorCustomizationProtocol {
  
  func errorCustomization(json: [String : Any]?, apiType: ApiTypes) -> Any? {
    switch apiType {
    case .primary:
      return json?["message"]
      
    case .secondary:
      return json?["status_code"]
      
    case .tertiary:
      return nil
      
    case .custom:
      return json?["status_code"]
    }
  }
}

HTTP 头处理

在需要向 Quick API 请求添加 HTTP 头时,设置 setHeaderCompletion(delegate: HttpCustomizationProtocols) 和 setHeaderCompletionForMultipart(delegate: HttpCustomizationProtocols)。将 HttpCustomizationProtocols 协议添加到您的类中。您可以在函数内部返回根据您的 api 类型返回的 HTTP 头。这是可选的。

import Alamofire
import QuickApi

extension QuickSettings: HttpCustomizationProtocols {
  
  func httpHeaderCustomization(apiType: ApiTypes) -> HTTPHeaders? {
    switch apiType {
    case .primary:
      return nil
      
    case .secondary:
      return [
        "Authorization" : "Bearer anyToken",
        "Content-Type" : "application/json;charset=utf-8"
      ]
      
    case .tertiary:
      return nil
      
    case .custom:
      return nil
    }
  }
}

状态码处理

当您想根据 Quick API 请求的状态码采取行动时,设置 setStatusCodeHandler(delegate: StatusCodeHandlerProtocol) 和 setStatusCodeHandlerForMultipart(delegate: StatusCodeHandlerProtocol)。将 HttpCustomizationProtocols 协议添加到您的类中。然后您可以根据您的 api 类型采取必要的行动。这是可选的。

import QuickApi

extension QuickSettings: StatusCodeHandlerProtocol {
  
  func handleStatusCodeFor(apiType: ApiTypes, statusCode: Int) {
    switch apiType {
    case .primary:
      if statusCode == 301 {
       // Do some logic stuff what you need. 
      }
      
    case .secondary:
      break
      
    case .tertiary:
      break
      
    case .custom:
      break
    }
  }
}

未授权处理

设置setUnauthorized(delegate: UnauthorizedCustomizationProtocol)和setUnauthorizedForMultipart(delegate: UnauthorizedCustomizationProtocol)以实现当您的请求返回401错误代码(即未授权)时您可以采取行动。将UnauthorizedCustomizationProtocol协议添加到您的类中。在这些过程之后,如果您的请求收到401错误,此函数将被触发,您可以根据您的API类型采取行动。在这里,您可以发送所需的刷新令牌请求。当您的操作完成后,将调用完成,并再次调用接收最后一个401错误的请求。

import QuickApi

class QuickSettings: UnauthorizedCustomizationProtocol {
  
  func unauthorizedCustomization(apiType: ApiTypes, completion: @escaping () -> ()) {
    switch apiType {
    case .primary:
      completion()
      
    case .secondary:
    break
      
    case .tertiary:
      break
      
    case .custom:
      break
    }
  }
}

作者

Ferhan Akkan, [email protected]

许可证

QuickApi可在MIT许可证下使用。更多详情请参阅LICENSE文件。