CocoaPods trunk is moving to be read-only. Read more on the blog, there are 19 months to go.

Leaf 1.3.0

Leaf 1.3.0

Maintained by Meniny.



Leaf 1.3.0

Meet Leaf

Leaf

Author EMail MIT
Version Platforms Swift
Build Passing Cocoapods Carthage SPM

🏵 Introduction

Leaf is a versatile HTTP(s) networking framework written in Swift.

🌟 Features

  • ✓ Chainable Request / Response Methods

  • ✓ Asynchronous & synchronous task execution

  • ✓ Basic, Bearer & Custom Authorization Handling

  • URL / JSON / Property List Parameter Encoding

  • ✓ Upload File / Data / Stream / Multipart Form Data

  • ✓ Download File using Request / Resume Data

  • ✓ Authentication with URLCredential

  • ✓ Custom Cache Controls

  • ✓ Custom Content Types

  • ✓ Upload & Download Progress Closures

  • cURL Command Debug Output

  • ✓ Request & Response Interceptors

  • ✓ Inference of response object type

  • ✓ Network reachability

  • TLS Certificate & Public Key Pinning

  • ✓ Retry requests

  • Codable protocols compatible (JSON / Property List)

  • watchOS Compatible

  • tvOS Compatible

  • macOS Compatible

📋 Requirements

Type Requirement

Platform

iOS

8.0

macOS

10.9

tvOS

9.0

watchOS

2.0

Linux

N/A

IDE

Xcode

10.2

Language

Swift

5

📲 Installation

CocoaPods

Leaf is available on CocoaPods.

use_frameworks!
pod 'Leaf'

Manually

Copy all files in the Leaf directory into your project.

🛌 Dependency

N/A

❤️ Contribution

You are welcome to fork and submit pull requests.

🔖 License

Leaf is open-sourced software, licensed under the MIT license.

🔫 Usage

import Leaf

do {
    let url = URL(string: "https://domain.com/someapi")!
    try Leaf.init(u, parameters: ["lan": "en-US"]).async(.GET, progress: { (progress) in
        // ...
    }, success: { (response) in
        // ...
    }, failure: { (error) in
        // ...
    })
} catch {
    // ...
}

⚙️ Advanced

Build a LeafRequest

import Leaf

do {
    let request = try LeafRequest.builder("https://domain.com/someapi")!
                .setAccept(.json)
                .setCache(.reloadIgnoringLocalCacheData)
                .setMethod(.PATCH)
                .setTimeout(20)
                .setJSONBody(["foo", "bar"])
                .setContentType(.json)
                .setServiceType(.background)
                .setCacheControls([.maxAge(500)])
                .setURLParameters(["foo": "bar"])
                .setAcceptEncodings([.gzip, .deflate])
                .setBasicAuthorization(user: "user", password: "password")
                .setHeaders(["foo": "bar"])
                .build()
} catch {

}

Request asynchronously

import Leaf

let Leaf = LeafURLSession()

Leaf.dataTask(URL(string: "https://domain.com/someapi")!).async(success: { (response) in

}, failure: { (error) in

})

Request synchronously

import Leaf

let Leaf = LeafURLSession()

do {
    let object: [AnyHashable: Any] = try Leaf.dataTask("https://domain.com/someapi").sync().object()
} catch {

}

Request from cache

import Leaf

let Leaf = LeafURLSession()

do {
    let object: [AnyHashable: Any] = try Leaf.dataTask("https://domain.com/someapi").cached().object()

} catch {

}

Track progress

import Leaf

let Leaf = LeafURLSession()

do {
    let task = try Leaf.dataTask("https://domain.com/someapi").progress({ progress in
    }).sync()
} catch {

}

Add interceptors for all requests

import Leaf

let Leaf = LeafURLSession()

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

Retry requests

import Leaf

let Leaf = LeafURLSession()

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

do {
    let task = try Leaf.dataTask("https://domain.com/someapi").retry({ response, error, retryCount in
        return retryCount < 2
    }).sync()
} catch {

}

🧙‍♂️ Codable

Encodable

import Leaf

let request = LeafRequest.builder("https://domain.com/someapi")!
            .setJSONObject(Encodable())
            .build()

Decodable

import Leaf

let Leaf = URLSession()

do {
    let object: Decodable = try Leaf.dataTask("https://domain.com/someapi").sync().decode()

} catch {

}