swapi 0.9.3

swapi 0.9.3

Saleh Albuga 维护。



swapi 0.9.3

  • Saleh Albuga

Swapi

一个简单的网络抽象库,仅使用 URLSession。支持 Swift 4.0 的 Decodable 协议进行 JSON 反序列化。无偏见且简单。

大多数应用程序都有一个共同点,那就是 API 调用。我们有时会因需求而感到困惑并问“我们从哪里开始?”。您可以在 iOS 应用中立即定义您的 API!无论它们的规模有多大!不再需要“APIHelpers”或“APIManagers”。Swapi 以小巧的足迹满足您的基本 API 需求!

Swapi: SwiftAPI :]

安装

目前您可以通过CocoaPods来获取Swapi,在Podfile中添加以下内容:

pod 'swapi', '~> 0.9.3'

使用方法

定义API

使用Swapi定义API既简单又有趣,与Swift配合得很好。创建一个符合APIDefinitionProtocol枚举,并按需实现您API的属性。以下是一个示例:

import swapi

enum MusicAPI {
    case search(term: String, limit: Int)
}

extension MusicAPI: APIDefinitionProtocol {
    
    var method: HttpMethod {
        switch self {
        case .search(_,_):
            return .GET
        }
    }
    
    var baseURL: String {
        return "https://itunes.apple.com/"
    }
    
    var path: String {
        switch self {
        case .search(_,_):
            return "search"
        }
    }
    
    var url: String {
        return "\(self.baseURL)\(self.path)"
    }
    
    var paramsType: ParamsType {
        switch self {
        case .search(_,_):
            return .QueryString
        }
    }
    
    var additionalQueryString: [String : String]? {
       return nil
    }
    
    var apiKeyRequired: Bool {
        return false
    }
    
    var apiKey: String? {
        return nil
    }
    
    var apiKeyName: String? {
        return ""
    }
    
    var apiKeyLocation: valueLocation? {
        return .none
    }
    
    var parameters: [String : String]? {
        switch self {
        case let .search(term, limit):
            return ["term": term, "limit": "\(limit)"]
        }
    }
    
    var headers: [String : String]? {
        return nil
    }
    
    var sharedHeaders: [String : String]? {
        return nil
    }
    
}

调用API

按照以下方式使用APIRequester中的request(_,_,_)方法调用定义的API。库将返回一个包含反序列化响应或错误的结果对象。

 APIRequester.shared.request(endpoint: MusicAPI.search(term: term, limit: 25), deserialize: ResultResponse.self) { (result) in
            DispatchQueue.main.async {
            switch result {
            case let .success(response):
                if let searchResults = response {
                    self.results = searchResults.results
                    self.tableView.reloadData()
                }
                break
            case let .failure(error):
                switch error.innerError {
                case .connectionError:
                      ...
                    break
                case .badRequest:
                    ...
                    break
                default:
                    break;
                }
                break         
            }
        }
        }

如果您想使用经典的URLSession回调,可以调用RequestRaw(_,_)

  APIRequester.shared.requestRaw(endpoint: MusicAPI.search(term: "OneRepublic", limit: 25)) { (data, response, error) in
         ...   
        }

您可以将自己的URLSession传递过去。

    APIRequester.shared.request(endpoint: MusicAPI.search(term: "Coldplay", limit: 25), deserialize: ResultResponse.self, session: yourURLSession) { (result) in
                ...
        }

定义模型

您可以使用Swift 4中的Decodable来定义模型,并将其传递给Swapi进行反序列化,如request(_,_,_)示例所示。

struct Result: Decodable {
    
    var artistId: Int
    var trackId: Int
    var kind: String
    var artist: String
    var collection: String
    var trackName: String
    
    
    private enum codingKeys: String, CodingKey {
        case artistId = "artistId"
        case trackId = "trackId"
        case kind = "kind"
        case artist = "artistName"
        case collection = "collectionName"
        case trackName = "trackName"
    }
    
    
    init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: codingKeys.self)
        
        artistId = try container.decode(Int.self, forKey: .artistId)
        trackId = try container.decode(Int.self, forKey: .trackId)
        trackName = try container.decode(String.self, forKey: .trackName)
        artist = try container.decode(String.self, forKey: .artist)
        collection = try container.decode(String.self, forKey: .collection)
        kind = try container.decode(String.self, forKey: .kind)
        
    }
    
}

日志记录

您可以为调试开启日志记录功能。

    APIRequester.shared.debugLogging = true

关于

我最初撰写这篇文档时正在与ArabiaWeather Inc.合作,并且在生产中使用过。这是一个基本的开源版本,我将很快对其进行更新和改进。

贡献

对任何反馈、错误报告或想法,请随意提出问题或甚至是拉取请求。

流水线

  • 更好的文档
  • 发布测试
  • 更好的日志记录
  • 更多功能:]