NetClient 0.5.0

NetClient 0.5.0

测试已测试
语言 SwiftSwift
许可证 MIT
发布最后发布2018年9月
SPM支持SPM

alexruperez维护。




NetClient 0.5.0

Twitter Version License Platform Swift Carthage compatible Swift Package Manager Compatible Build Status Help Contribute to Open Source

Net是用Swift编写的高效HTTP网络库。

🌟特性

  • URL / JSON / 属性列表参数编码
  • 上传文件 / 数据 / 流 / 多部分表单数据
  • 使用请求或恢复数据下载文件
  • 使用URLCredential进行身份验证
  • 基本、Bearer和自定义授权处理
  • 默认和自定义缓存控制
  • 默认和自定义内容类型
  • 上传和下载进度闭包支持进度(仅iOS>=11)
  • cURL命令调试输出
  • 请求和响应拦截器
  • 异步和同步任务执行
  • 推断响应对象类型
  • 网络可达性
  • TLS证书和公钥固定
  • 重试请求
  • Codable / Decodable / Encodable协议兼容(JSON / 属性列表)
  • 自定义可接受状态码范围
  • 支持watchOS
  • 支持tvOS
  • 支持macOS
  • Alamofire实现
  • MoyaProvider扩展
  • Kommander扩展
  • RxSwift扩展
  • 占位符实现

📋要求

  • iOS 8.0+ / macOS 10.9+ / tvOS 9.0+ / watchOS 2.0+
  • Xcode 9.0+
  • Swift 4.0+

📲安装

Net通过CocoaPods可用。要安装它,只需将以下行添加到Podfile中:

pod 'NetClient'

为了与Swift 3兼容,使用

pod 'NetClient', '~> 0.2'

或者您可以使用Carthage来安装

github "intelygenz/NetClient-iOS"

或者使用Swift Package Manager安装

dependencies: [
    .package(url: "https://github.com/intelygenz/NetClient-iOS.git")
]

🐒用法

构建NetRequest

import Net

do {
    let request = try NetRequest.builder("YOUR_URL")!
                .setAccept(.json)
                .setCache(.reloadIgnoringLocalCacheData)
                .setMethod(.PATCH)
                .setTimeout(20)
                .setJSONBody(["foo", "bar"])
                .setContentType(.json)
                .setServiceType(.background)
                .setCacheControls([.maxAge(500)])
                .setURLParameters(["foo": "bar"])
                .setAcceptEncodings([.gzip, .deflate])
                .setContentEncodings([.gzip])
                .setBasicAuthorization(user: "user", password: "password")
                .setHeaders(["foo": "bar"])
                .build()
} catch {
    print("Request error: \(error)")
}

异步请求

import Net

let net = NetURLSession()

net.data(URL(string: "YOUR_URL")!).async { (response, error) in
    do {
        if let object: [AnyHashable: Any] = try response?.object() {
            print("Response dictionary: \(object)")
        } else if let error = error {
            print("Net error: \(error)")
        }
    } catch {
        print("Parse error: \(error)")
    }
}

同步请求

import Net

let net = NetURLSession()

do {
    let object: [AnyHashable: Any] = try net.data("YOUR_URL").sync().object()
    print("Response dictionary: \(object)")
} catch {
    print("Error: \(error)")
}

从缓存请求数据

import Net

let net = NetURLSession()

do {
    let object: [AnyHashable: Any] = try net.data("YOUR_URL").cached().object()
    print("Response dictionary: \(object)")
} catch {
    print("Error: \(error)")
}

跟踪进度

import Net

let net = NetURLSession()

do {
    let task = try net.data("YOUR_URL").progress({ progress in
        print(progress)
    }).sync()
} catch {
    print("Error: \(error)")
}

为所有请求添加拦截器

import Net

let net = NetURLSession()

net.addRequestInterceptor { request in
    request.addHeader("foo", value: "bar")
    request.setBearerAuthorization(token: "token")
    return request
}

重试请求

import Net

let net = NetURLSession()

net.retryClosure = { response, _, _ in response?.statusCode == XXX }

do {
    let task = try net.data("YOUR_URL").retry({ response, error, retryCount in
        return retryCount < 2
    }).sync()
} catch {
    print("Error: \(error)")
}

🧙‍♂️ 可编码

可编码

import Net

let request = NetRequest.builder("YOUR_URL")!
            .setJSONObject(Encodable())
            .build()

可解码

import Net

let net = NetURLSession()

do {
    let object: Decodable = try net.data("YOUR_URL").sync().decode()
    print("Response object: \(object)")
} catch {
    print("Error: \(error)")
}

🤝集成

喜欢 Alamofire 吗?

pod 'NetClient/Alamofire'
import Net

let net = NetAlamofire()

...

喜欢 Moya 吗?

pod 'NetClient/Moya'
import Net
import Moya

let request = NetRequest("YOUR_URL")!
let provider = MoyaProvider<NetRequest>()
provider.request(request) { result in
    switch result {
    case let .success(response):
        print("Response: \(response)")
    case let .failure(error):
        print("Error: \(error)")
    }
}

喜欢 Kommander 吗?

pod 'NetClient/Kommander'
import Net
import Kommander

let net = NetURLSession()
let kommander = Kommander.default

net.data(URL(string: "YOUR_URL")!).execute(by: kommander, onSuccess: { object in
    print("Response dictionary: \(object as [AnyHashable: Any])")
}) { error in
    print("Error: \(String(describing: error?.localizedDescription))")
}

net.data(URL(string: "YOUR_URL")!).executeDecoding(by: kommander, onSuccess: { object in
	print("Response object: \(object as Decodable)")
}) { error in
    print("Error: \(String(describing: error?.localizedDescription))")
}

喜欢 RxSwift 吗?

pod 'NetClient/RxSwift'
import Net
import RxSwift

let request = NetRequest("YOUR_URL")!
_ = net.data(request).rx.response().observeOn(MainScheduler.instance).subscribe { print($0) }

方法存根 实现

pod 'NetClient/Stub'
import Net

let net = NetStub()

net.asyncBehavior = .delayed(.main, .seconds(10)) // If you want to delay the response.

net.nextResult = .response(NetResponse.builder()....build())

// Your test request here

net.nextResult = .error(.net(code: 500, message: "Your network error.", headers: ..., object: ..., underlying: ...))

// Your test request here

❤️等等。

  • 非常欢迎贡献。
  • 赞赏归功(让我们传播消息!),但并非强制。

💻作者

alexruperez[email protected]

👮‍♂️许可证

网络软件许可协议为MIT许可。详细信息请参阅LICENSE文件。