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

iService 0.0.3

iService 0.0.3

TestsTested
LangLanguage SwiftSwift
License MIT
ReleasedLast Release Dec 2015
SPMSupports SPM

Maintained by Jakub Zaczek.



iService 0.0.3

  • By
  • Jakub Zaczek

iService

Communication with RESTful interfaces made simple.

Installation

Copy this line into your podfile:

pod 'iService', '~> 0.0'

Make sure to also add !use_frameworks

Description

iService provides two classes: Service which is a representation of a RESTful Service and a ServiceRealm which is a container for shared request configuration.

Service

Service class provides a CRUD (Create, Retrieve, Update, Destroy) interface for interacting with RESTful APIs. Each CRUD method returns a Promise from iPromise

let userService = Service(baseUrl: NSURL(string: "jsonplaceholder.typicode.com/users")!)

// does a GET on https://jsonplaceholder.typicode.com/users/1?
userService.retrieve("1").then({ result in
    let request = result.request    // NSURLRequest
    let response = result.response  // NSHTTPURLResponse
    let data = result.data          // NSData
    let error = result.error        // NSError
})

Services can register themselves in a Realm to use shared request cofiguration:

ServiceRealm.get("jsonplaceholder").register(userService)

// or 
ServiceRealm.register(userService, forRealmAtKey: "jsonplaceholder")

// or 
userService.registerForRealm(ServiceRealm.get("jsonplaceholder"))

Configuration from ServiceRealm can be overriden on a per-request basis.

let user = "{\"userId\": 1}".dataUsingEncoding(NSUTF8StringEncoding)!

// let's add some headers
userService
    .override({ configuration
        configuration.addHeader("Content-Type", withValue: "application/json")
    })
    .create(user)
    .then({ result in
        //...
    })

// this request will not inherit headers from previous call
userService
    .retrieve("1")
    .then({ result in
        //...
    })

ServiceRealm

ServiceRealm is a container for common configuration, e.g.:

  • request authorization
  • content types
  • accepted languages

ServiceRealm provides a map of CRUD-HTTP methods, that can be overriden:

static public let defaultCRUDMap: CRUDMap = [
    .CREATE:    .POST,
    .RETRIEVE:  .GET,
    .UPDATE:    .PUT,
    .DESTROY:   .DELETE
]

// override by calling
public func overrideCrudMap(map: CRUDMap) -> ServiceRealm

//or
public func overrideCrudMethod(method: Service.CRUDMethod, withHTTPMethod httpMethod: Service.HTTPMethod) -> ServiceRealm

HTTP headers can be configured globally, or per CRUD method:

public typealias HTTPHeaderDictionary = [String: String]

public func addHeader(header: String, withValue value: String) -> ServiceRealm 
public func addHeaders(headers: HTTPHeaderDictionary) -> ServiceRealm
public func addHeader(header: String, withValue value: String, specificForCRUDMethod crudMethod: Service.CRUDMethod) -> ServiceRealm
public func addHeaders(headers: HTTPHeaderDictionary, specificForCRUDMethod crudMethod: Service.CRUDMethod) -> ServiceRealm

Same goes for cache policy:

public func overrideGlobalCachePolicy(cachePolicy: NSURLRequestCachePolicy) -> ServiceRealm
public func overrideCachePolicy(cachePolicy: NSURLRequestCachePolicy, forCrudMethod method: Service.CRUDMethod) -> ServiceRealm

Configuration calls can be chained, so that full workflow looks like this:

let userService = Service(baseUrl: NSURL(string: "jsonplaceholder.typicode.com/users")!)

ServiceRealm.get("jsonplaceholder")
    .addHeaders([
        "Authorization": "Token sagsrbiusd90322sdf4f3gd4",
        "Content-Type": "application/json",
    ])
    .addHeader("Accept-Language", withValue: "en", specificForCRUDMethod: .RETRIEVE)
    .overrideGlobalCachePolicy(NSURLRequestCachePolicy.ReloadIgnoringLocalAndRemoteCacheData)
    .register(userService)

userService.retrieve("1").then({ result in
    // ...
})

Documentation

Documentation is available here

Licence

See LICENCE