测试已测试 | ✓ |
Lang语言 | SwiftSwift |
许可证 | MIT |
发布最新发布 | 2017年9月 |
SwiftSwift版本 | 4.0 |
SPM支持SPM | ✗ |
由Phillipe Casorla维护。
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,这可以在无需对代码进行任何更改的情况下无缝发生以进行测试。
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 文件。