QuickApi
QuickApi 允许您在不处理解码操作的情况下在应用中使用多个 API。除此之外,它还允许您以简化的方式解决错误处理、401 未授权处理、状态码处理等问题。QuickApi 支持 GET、POST、DELETE、PUT、PATCH 以及多部分请求。
特性
- 支持 3 个不同的 API 和自定义请求。
- 支持多部分请求的 3 个不同的 API 和自定义请求。
- 响应对象将自动解码
- 请求重试支持
- 错误处理
- HTTP 报头处理
- 状态码处理
- 未授权处理
内容
要求
- iOS 11+
- Swift 5+
- Xcode 10+
安装
CocoaPods
Jake 可通过 CocoaPods 获取。要安装它,只需将以下行添加到 Podfile 文件中
pod 'QuickApi'
Swift 包管理器
- 文件 > Swift 包 > 添加包依赖
- 添加
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文件。