NetworkingServiceKit 1.1.1

NetworkingServiceKit 1.1.1

测试已测试
Lang语言 SwiftSwift
许可证 MIT
发布最新发布2017年9月
SwiftSwift版本4.0
SPM支持SPM

Phillipe Casorla维护。



NetworkingServiceKit

描述

NetworkingServiceKit是一个用于构建模块化微服务的库。它完全用swift编写,遵循一种称为服务定位器的设计模式。

NetworkingServiceKit可作为标准iOS单体API客户端的完整替换。通过采用服务模块化方法,框架允许应用程序选择它运行的所需服务,从而实现无缝的网络请求。

网络通常是服务层所需的最大责任之一,并且是大多数应用程序的标准需求。NetworkingServiceKit为请求提供开箱即用的身份验证。它使用解耦的AlamoFire客户端以及一系列定义您的身份验证需求的协议,以便在封装令牌身份验证的同时无缝执行请求。这使得更改您的网络架构变得轻而易举 - 更新Alamofire版本或使用模拟网络库,不再需要完全重写,而变成了一项微不足道的工作。

要启动我们的ServiceLocator类,您需要定义服务列表以及身份验证、令牌和服务器详情的实现。例如

ServiceLocator.set(services: [TwitterAuthenticationService.self,LocationService.self,TwitterSearchService.self],
                           api: TwitterAPIConfigurationType.self,
                           auth: TwitterApp.self,
                           token: TwitterAPIToken.self)

在这个示例中,我们创建了一个简单的Twitter客户端并实现了Twitter令牌处理、身份验证,并定义了它们的服务器细节。我们的TwitterAPIConfigurationType告诉服务层有关我们的服务器基本URL信息。TwitterApp提供了进行带密钥和密钥的请求所需的详细信息。TwitterAPIToken实现了当我们被认证后如何解析和存储令牌信息。

一旦我们客户端被认证,所有通过我们实现的服务发送的请求都将自动由我们实现的APIToken进行签名。

要请求加载的某个服务,您只需向服务定位器提出请求,例如

let twitterSearchService = ServiceLocator.service(forType: TwitterSearchService.self)
twitterSearchService?.searchRecents(by: searchText, completion: { [weak self] results in

            if let annotations = self?.mapView.annotations {
                self?.mapView.removeAnnotations(annotations)
            }
            self?.currentResults = results
            self?.tweetsTableView.reloadData()
            self?.showTweetsLocationsOnMap()
        })

每个定义的服务都可以通过重写servicePath和serviceVersion属性与特定的微服务路径和版本相关联,例如

open class TwitterSearchService: AbstractBaseService {

    public override var serviceVersion: String {
        return "1.1"
    }

    public override var servicePath:String {
        return "search"
    }

    public func searchRecents(by hashtag:String,
                              completion:@escaping (_ results:[TwitterSearchResult])-> Void) {
    }
}

这将为 TwitterSearchService 中所有以 search/1.1/ 开头的请求 URL 自动添加前缀,因此对于上面的示例函数,执行的完整请求 URL 可能类似于 https://api.twitter.com/search/v4/tweets.json

替换

NetworkingServiceKit 通过自定义 API 客户端 StubNetworkManager 支持开箱即用的请求替换。

ServiceLocator.defaultNetworkClientType = StubNetworkManager.self

一旦您设置了我们的替换客户端,您只需要请求一组编造的服务,如果这些编造与服务定义的相同标准匹配,则这些编造将自动链接到请求。例如

let searchStub = ServiceStub(execute:
            ServiceStubRequest(path: "/1.1/search/tweets.json",
                               parameters: ["q" : "#makespace"]),
                                     with: .success(code: 200,
                                                    response: ["statuses" : [["text" : "tweet1" ,
                                                                              "user" : ["screen_name" : "darkzlave",
                                                                                        "profile_image_url_https" : "https://lol.png",
                                                                                        "location" : "Stockholm, Sweden"]],
                                                                             ["text" : "tweet2" ,
                                                                              "user" : ["screen_name" : "makespace",
                                                                                        "profile_image_url_https" : "https://lol2.png",
                                                                                        "location" : "New York"]]],
                                                               "search_metadata" : ["next_results" : "https://search.com/next?pageId=2"]
                                        ]), when: .authenticated(tokenInfo: ["token_type" : "access",
                                                                             "access_token" : "KWALI"]),
                                            react:.delayed(seconds: 0.5))
let searchService = ServiceLocator.service(forType: TwitterSearchService.self, stubs: [searchStub])                         

我们的示例搜索编造将返回所有在路径 /1.1/search/tweets.json?q=#makespace 下 .get 认证请求的情况,并且请求将在 0.5 秒后返回。对于我们的 TwitterSearchService,这可以在无需对代码进行任何更改的情况下无缝发生以进行测试。

ReactiveSwift

NSK 包括通过 ReactiveSwiftNetworkManager 支持的 ReactiveSwift。这允许服务返回 SignalProducer 而不是依赖于完成块。这可以轻松实现网络响应的链式和映射,例如

func searchNextRecentsPageProducer() -> SignalProducer<[TwitterSearchResult],MSError> {
    guard let nextPage = self.nextResultsPage else {
        return SignalProducer.empty
    }
    let request = request(path: "search/tweets.json\(nextPage)")
    return request.map { response -> [TwitterSearchResult] in
        var searchResults = [TwitterSearchResult]()
        
        guard let response = response else { return searchResults }
        
        if let results = response["statuses"] as? [[String:Any]] {
            for result in results {
                if let twitterResult = TwitterSearchResult(dictionary: result) {
                    searchResults.append(twitterResult)
                }
            }
        }

        return searchResults
    }
}

示例

要运行示例项目,请先从 Example 目录中克隆仓库,然后运行 pod install

示例项目由一个非常简单的使用 Twitter 的 Application-only 认证自动认证的 Twitter 客户端组成(https://dev.twitter.com/oauth/application-only)。该客户端支持搜索推文、分页结果和显示列出的推文的地图位置。

要求

安装

NetworkingServiceKit 可通过 CocoaPods 获得。安装它,只需将以下行添加到您的 Podfile

pod "NetworkingServiceKit"

作者

darkzlave, [email protected]

许可证

NetworkingServiceKit 在 MIT 许可证下可用。有关更多信息,请参阅 LICENSE 文件。