Twitter Version License Platform Swift Carthage compatible Swift Package Manager Compatible Build Status Help Contribute to Open Source
Net is a versatile HTTP networking library written in Swift.
- URL / JSON / Property List Parameter Encoding
- Upload File / Data / Stream / Multipart Form Data
- Download File using Request or Resume Data
- Authentication with URLCredential
- Basic, Bearer and Custom Authorization Handling
- Default and Custom Cache Controls
- Default and Custom Content Types
- Upload and Download Progress Closures with Progress (only iOS >= 11)
- cURL Command Debug Output
- Request and Response Interceptors
- Asynchronous and synchronous task execution
- Inference of response object type
- Network reachability
- TLS Certificate and Public Key Pinning
- Retry requests
- Codable / Decodable / Encodable protocols compatible (JSON / Property List)
- Customizable acceptable status codes range
- watchOS Compatible
- tvOS Compatible
- macOS Compatible
- Alamofire Implementation
- MoyaProvider Extension
- Kommander Extension
- RxSwift Extension
- Stub Implementation
- iOS 8.0+ / macOS 10.9+ / tvOS 9.0+ / watchOS 2.0+
- Xcode 9.0+
- Swift 4.0+
Net is available through CocoaPods. To install it, simply add the following line to your Podfile:
pod 'NetClient'
For Swift 3 compatibility use:
pod 'NetClient', '~> 0.2'
Or you can install it with Carthage:
github "intelygenz/NetClient-iOS"
Or install it with Swift Package Manager:
dependencies: [ .package(url: "https://github.com/intelygenz/NetClient-iOS.git") ]
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)") }
Love Alamofire?
pod 'NetClient/Alamofire'
import Net let net = NetAlamofire() ...
Love 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)") } }
Love 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))") }
Love RxSwift?
pod 'NetClient/RxSwift'
import Net import RxSwift let request = NetRequest("YOUR_URL")! _ = net.data(request).rx.response().observeOn(MainScheduler.instance).subscribe { print(0ドル) }
Stub Implementation
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
- Contributions are very welcome.
- Attribution is appreciated (let's spread the word!), but not mandatory.
alexruperez, alejandro.ruperez@intelygenz.com
Net is available under the MIT license. See the LICENSE file for more info.