NetService is an lightweight and pure Swift implemented HTTP library for request / download / upload from network. This project is inspired by the popular Alamofire and AFNetworking。Although this project is also built on the URL Loading System, but there are fundamentally different between this project and Alamofire/AFNetworking。Both the design concept and the usage
- URL / JSON Parameter Encoding
- Asynchronous and synchronous requests
- Upload File / Data / Stream / MultipartFormData
- Download File using Request or Resume Data
- Authentication with
URLCredential
- Support Authentication header three type:
Bearer
/Basic
/ Custom token - Upload and Download Progress Closures with Progress
- Retry requests
- TLS Certificate and Public Key Pinning
- Pequest Middlewares
- macOS Compatible
- Default and Custom Cache Controls
- Default and Custom Content Types
- Usage
- iOS 10.0+ / macOS 10.15+
- Xcode 12 +
- Swift 5.0 +
pod 'NetService', '~> 1.0.5'
final class YourAPI: DataNetService, NetServiceProtocol {
var timeout: TimeInterval {
30
}
var authorization: NetServiceBuilder.Authorization {
return .none
}
var encoding: ParameterEncoding {
return URLEncoding.default
}
var credential: URLCredential? {
return nil
}
func httpHeaders() -> [String : String] {
[:]
}
func httpParameters() -> [String : Any] {
[:]
}
func httpBuilderHelper(builder: NetServiceBuilder) -> NetServiceBuilder {
return builder
}
var urlString: String {
return _urlString
}
var httpMethod: NetBuilders.Method {
return _method
}
// above code is conforms to NetServiceProtocol protocol
private var _urlString: String
private var _method: NetBuilders.Method = .GET
init(with url: String) {
_urlString = url
}
func setMethod(method: NetBuilders.Method) -> Self {
_method = method
return self
}
}
let urlString = "https://httpbin.org/get"
let api = YourAPI(with: urlString)
api.async { (request) in
let response = request.response
request
....
}
let urlString = "https://httpbin.org/get"
let api = YourAPI(with: urlString)
let response = api.sync().response
...
class DownloadAPI: DownloadNetService, NetServiceRequestProtocol {
var urlString: String {
return _urlString
}
func httpHeaders() -> [String : String] {
return _parameters
}
func httpParameters() -> [String : Any] {
return _headers
}
....
// Above Code is conforms to NetServiceRequestProtocol
private var _urlString = ""
private var _parameters: [String: Any] = [:]
private var _headers: [String: String] = [:]
init(with url: String, parameters: [String: Any] = [:]) {
_urlString = url
_parameters = parameters
}
init(with url: String, headers: [String: String]) {
_urlString = url
_headers = headers
}
}
let fielURL = ... // donwload file save url
let destination: DestinationClosure = {_, _ in fielURL } // config download file position
let numberOfLines = 100
let urlString = "https://httpbin.org/stream/\(numberOfLines)"
let downloadProgresssView: UIProgressView = ....
DownloadAPI(with: urlString).download(progress: { (progress) in
downloadProgresssView.progress = Float(progress.fractionCompleted)
}, to: destination) { (request) in
let downloadFileURL = request.response.downloadFileURL
print(downloadFileURL)
}
class BaseUploadManager: UploadNetService, NetServiceRequestProtocol {
...
var urlString: String {
return _urlString
}
// Above Code is conforms to NetServiceRequestProtocol
var _urlString: String = ""
init(with url: String) {
_urlString = url
}
}
let urlString = "https://httpbin.org/post"
let bundle = Bundle(for: BaseTestCase.self)
let imageURL = bundle.url(forResource: "rainbow", withExtension: "jpg")!
let uplodProgressView: UIProgressView = ...
UploadAPI(with: urlString).upload(file: imageURL) { (progress: Progress) in
uplodProgressView.progress = Fload(progress.fractionCompleted)
} completion: { (request) in
res = request.response
if let responseString = res?.responseString {
print(responseString)
}
}
more usage in example and unit test case
IF you want to contribute, the Contributing guide is the best place to start. If you have questions, feel free to ask.
NetService is released under the MIT license. See LICENSE for details.