All you need is
SwiftSafe | Expressive | Fast
Chris Bailey
@Chris__Bailey
AB Vijay Kumar
@abvijaykumar
We delivered >100 apps that change
the way people work
We created Accelerators for iOS
custom app delivery
We now bring everything together for
enterprise wide integration of iOS app
services
In July 2014 Apple and IBM announced a partnership to transform enterprise
mobility.
100+Apps
14Industries
50+Clients
PUBLIC NETWORK CLOUD NETWORK ENTERPRISE NETWORK
Mobile App
EDGE SERVICES
LOAD BALANCER
CONNECTIVITY
ENTERPRISE
APPLICATION
Mobile Services Enterprise
Integration
DevOps Services
MOBILE MIDDLEWARE
PUSN NOTIFICATION
MOBILE DATA STOREMOBILE SECURITY
API MANAGEMENT
STORAGE
MOBILE ANALYTICS
Data Services
NOTIFICATION SERVICE
PROVIDER
API Services CLIENT
FIREWALL
MOBILE APP
LIFECYCLE
CONTINUOUS
RELEASE
CONTINUOUS BUSINESS
PLANNING
CONTINUOUS
MONITORING & FEEDBACK
CONFIGURATION
MANAGEMENT CONTINUOUS
DEPLOYMENT
CACHING
ENTERPRISE DATA
ENTERPRISE
DIRECTORY
API INTEGRATION
Rapid App Development
Full Stack Development
Scalable & High performance Mobile backend
Easy Integration with other Cloud Services & Backend System
Rapid App Development
Full Stack Development
Scalable & High performance Mobile backend
Easy Integration with other Cloud Services & Backend System
Mouse Maze Free: Ā© Top Free Games
Mouse Maze Free: Ā© Top Free Games
Mouse Maze Free: Ā© Top Free Games
Mouse Maze Free: Ā© Top Free Games
IBM Expert Seller
IBM Expert Seller
Icons made by Freepik fromĀ www.flaticon.com
Icons made by Freepik fromĀ www.flaticon.com
Icons made by Freepik fromĀ www.flaticon.com
struct Profile {
var name: String
var photo: Data
var dateOfBirth: Date
}
Swift
{
"name": "",
"photo": "",
"dateOfBirth": ""
}
{
"name": "",
"photo": "",
"dateOfBirth": ""
}
struct Profile {
var name: String
var photo: Data
var dateOfBirth: Date
}
Swift
Swift
parsed = JSON.parse(data)
name = parsed["name"]
photo = parsed["photo"]
dateOfBirth = parsed["dateOfBirth"]
Node.js
struct Profile {
var name: String
var photo: Data
var dateOfBirth: Date
}
{
"name": "",
"photo": "",
"dateOfBirth": ""
}
parsed = JSON.parse(data)
name = parsed["name"]
photo = parsed["photo"]
dateOfBirth = parsed["dateOfBirth"]
{
"name": "",
"photo": "",
"dateOfBirth": ""
}
struct Profile {
var name: String
var photo: Data
var dateOfBirth: Date
}
Swift Node.js
parsed = JSON.parse(data)
name = parsed["name"]
photo = parsed["photo"]
dateOfBirth = parsed["dateOfBirth"]
{
"name": "",
"photo": "",
"dateOfBirth": ""
}
struct Profile {
var name: String
var photo: Data
var dateOfBirth: Date
}
Swift Node.js
Data
parsed = JSON.parse(data)
name = parsed["name"]
photo = parsed["photo"]
dateOfBirth = parsed["dateOfBirth"]
{
"name": "",
"photo": "",
"dateOfBirth": ""
}
struct Profile {
var name: String
var photo: Data
var dateOfBirth: Date
}
Swift Node.js
Data String
parsed = JSON.parse(data)
name = parsed["name"]
photo = parsed["photo"]
dateOfBirth = parsed["dateOfBirth"]
{
"name": "",
"photo": "",
"dateOfBirth": ""
}
struct Profile {
var name: String
var photo: Data
var dateOfBirth: Date
}
Swift Node.js
Data String
String
of data
parsed = JSON.parse(data)
name = parsed["name"]
photo = parsed["photo"]
dateOfBirth = parsed["dateOfBirth"]
{
"name": "",
"photo": "",
"dateOfBirth": ""
}
struct Profile {
var name: String
var photo: Data
var dateOfBirth: Date
}
Swift Node.js
parsed = JSON.parse(data)
name = parsed["name"]
photo = parsed["photo"]
dateOfBirth = parsed["dateOfBirth"]
{
"name": "",
"photo": "",
"dateOfBirth": ""
}
struct Profile {
var name: String
var photo: Data
var dateOfBirth: Date
}
Swift Node.js
Date
parsed = JSON.parse(data)
name = parsed["name"]
photo = parsed["photo"]
dateOfBirth = parsed["dateOfBirth"]
{
"name": "",
"photo": "",
"dateOfBirth": ""
}
struct Profile {
var name: String
var photo: Data
var dateOfBirth: Date
}
Swift Node.js
Date String
parsed = JSON.parse(data)
name = parsed["name"]
photo = parsed["photo"]
dateOfBirth = parsed["dateOfBirth"]
{
"name": "",
"photo": "",
"dateOfBirth": ""
}
struct Profile {
var name: String
var photo: Data
var dateOfBirth: Date
}
Swift Node.js
Date String String
parsed = JSON.parse(data)
name = parsed["name"]
photo = parsed["photo"]
dateOfBirth = parsed["dateOfBirth"]
struct Profile {
var name: String
var photo: Data
var dateOfBirth: Date
}
{
"name": "",
"photo": "",
"dateOfBirth": ""
}
{
"name": "",
"photo": "",
"dateOfBirth": {
"year":
"month":
"day":
}
}
Swift Node.js
Date String
struct Profile {
var name: String
var photo: Data
var dateOfBirth: Date
}
{
"name": "",
"photo": "",
"dateOfBirth": ""
}
{
"name": "",
"photo": "",
"dateOfBirth": {
"year":
"month":
"day":
}
}
Swift
parsed = JSON.parse(data)
name = parsed["name"]
photo = parsed["photo"]
dateOfBirth = parsed["dateOfBirth"]
year = dateOfBirth["year"]
month = dateOfBirth["month"]
day = dateOfBirth[ā€œday"]
Node.js
Date Strings
I have to learn Node.js?
(or Ruby, Python, Java, etc)
Swift
struct Profile {
var name: String
var photo: Data
var dateOfBirth: Date
}
Swift Swift
KITURA
struct Profile {
var name: String
var photo: Data
var dateOfBirth: Date
}
struct Profile: Codable {
var name: String
var photo: Data
var dateOfBirth: Date
}
struct Profile: Codable {
var name: String
var photo: Data
var dateOfBirth: Date
}
Swift Swift
KITURA
Codable
struct Profile: Codable {
var name: String
var photo: Data
var dateOfBirth: Date
}
Swift Swift
KITURA
struct Profile: Codable {
var name: String
var photo: Data
var dateOfBirth: Date
}
struct Profile: Codable {
var name: String
var photo: Data
var dateOfBirth: Date
}
Shared
struct Profile: Codable {
var name: String
var photo: Data
var dateOfBirth: Date
}
Swift Swift
let encoder = JSONEncoder()
let data = try encoder.encode(profile)
KITURA
struct Profile: Codable {
var name: String
var photo: Data
var dateOfBirth: Date
}
struct Profile: Codable {
var name: String
var photo: Data
var dateOfBirth: Date
}
struct Profile: Codable {
var name: String
var photo: Data
var dateOfBirth: Date
}
Swift Swift
let decoder = JSONDecoder()
let person = try decoder.decode(Person.self, from: jsonData)
KITURA
struct Profile: Codable {
var name: String
var photo: Data
var dateOfBirth: Date
}
struct Profile: Codable {
var name: String
var photo: Data
var dateOfBirth: Date
}
{
"name": "",
"photo": "",
"dateOfBirth": ""
}
{
"name": "",
"photo": "",
"dateOfBirth": ""
}
struct Profile: Codable {
var name: String
var photo: Data
var dateOfBirth: Date
}
Swift Swift
KITURA
struct Profile: Codable {
var name: String
var photo: Data
var dateOfBirth: Date
}
struct Profile: Codable {
var name: String
var photo: Data
var dateOfBirth: Date
}
struct Profile: Codable {
var name: String
var photo: Data
var dateOfBirth: Date
}
Swift Swift
struct Profile: Codable {
var name: String
var photo: Data
var dateOfBirth: Date
}
KITURA
struct Profile: Codable {
var name: String
var photo: Data
var dateOfBirth: Date
}
Deploy Deploy
KITURA
Deploy DeployGenerate
KITURA
Icons made by Freepik fromĀ www.flaticon.com
Icons made by Freepik fromĀ www.flaticon.com
Fetch the Profile for a user
from the Backend
var urlComponents = URLComponents()
urlComponents.scheme = "https"
urlComponents.host = "myhost.myserver.com"
urlComponents.path = ā€œ/profile"
Set up Backend URL
var urlComponents = URLComponents()
urlComponents.scheme = "https"
urlComponents.host = "myhost.myserver.com"
urlComponents.path = ā€œ/profile"
let userIdItem = URLQueryItem(name: "id", value: "(userId)")
urlComponents.queryItems = [userIdItem]
guard let url = urlComponents.url else { fatalError("Could not create URL from components") }
Set up Person ID
var urlComponents = URLComponents()
urlComponents.scheme = "https"
urlComponents.host = "myhost.myserver.com"
urlComponents.path = ā€œ/profile"
let userIdItem = URLQueryItem(name: "id", value: "(userId)")
urlComponents.queryItems = [userIdItem]
guard let url = urlComponents.url else { fatalError("Could not create URL from components") }
var request = URLRequest(url: url)
request.httpMethod = "GET"
Set up ā€œGETā€ request
var urlComponents = URLComponents()
urlComponents.scheme = "https"
urlComponents.host = "myhost.myserver.com"
urlComponents.path = ā€œ/profile"
let userIdItem = URLQueryItem(name: "id", value: "(userId)")
urlComponents.queryItems = [userIdItem]
guard let url = urlComponents.url else { fatalError("Could not create URL from components") }
var request = URLRequest(url: url)
request.httpMethod = "GET"
let session = URLSession(configuration: URLSessionConfiguration.default)
let task = session.dataTask(with: request) { (responseData, response, responseError) in
}
task.resume()
Set up URLSession
var urlComponents = URLComponents()
urlComponents.scheme = "https"
urlComponents.host = "myhost.myserver.com"
urlComponents.path = ā€œ/profile"
let userIdItem = URLQueryItem(name: "id", value: "(userId)")
urlComponents.queryItems = [userIdItem]
guard let url = urlComponents.url else { fatalError("Could not create URL from components") }
var request = URLRequest(url: url)
request.httpMethod = "GET"
let session = URLSession(configuration: URLSessionConfiguration.default)
let task = session.dataTask(with: request) { (responseData, response, responseError) in
}
task.resume()
Web Request
Web Response
Error
Call URLSession
var urlComponents = URLComponents()
urlComponents.scheme = "https"
urlComponents.host = "myhost.myserver.com"
urlComponents.path = ā€œ/profile"
let userIdItem = URLQueryItem(name: "id", value: "(userId)")
urlComponents.queryItems = [userIdItem]
guard let url = urlComponents.url else { fatalError("Could not create URL from components") }
var request = URLRequest(url: url)
request.httpMethod = "GET"
let session = URLSession(configuration: URLSessionConfiguration.default)
let task = session.dataTask(with: request) { (responseData, response, responseError) in
DispatchQueue.main.async {
guard responseError == nil else {
completion?(.failure(responseError!))
}
guard let jsonData = responseData else {
let error = NSError(domain: "", code: 0, userInfo: [NSLocalizedDescriptionKey: ā€œNo data"]) as Error
completion?(.failure(error))
}
}
}
task.resume()
Error Checking
var urlComponents = URLComponents()
urlComponents.scheme = "https"
urlComponents.host = "myhost.myserver.com"
urlComponents.path = ā€œ/profile"
let userIdItem = URLQueryItem(name: "id", value: "(userId)")
urlComponents.queryItems = [userIdItem]
guard let url = urlComponents.url else { fatalError("Could not create URL from components") }
var request = URLRequest(url: url)
request.httpMethod = "GET"
let session = URLSession(configuration: URLSessionConfiguration.default)
let task = session.dataTask(with: request) { (responseData, response, responseError) in
DispatchQueue.main.async {
guard responseError == nil else {
completion?(.failure(responseError!))
}
guard let jsonData = responseData else {
let error = NSError(domain: "", code: 0, userInfo: [NSLocalizedDescriptionKey: ā€œNo data"]) as Error
completion?(.failure(error))
}
let decoder = JSONDecoder()
do {
let person = try decoder.decode(Profile.self, from: jsonData)
completion?(.success(person))
} catch {
completion?(.failure(error))
}
}
}
task.resume()
Convert Response
router.get(ā€œ/profile", handler: getProfile)
func getProfile(request: RouterRequest, response: RouterResponse, next: @escaping () -> Void)
{
guard let contentType = request.headers["Content-Type"],
contentType.hasPrefix("application/json") else {
response.status(.unsupportedMediaType)
response.send(error)
return next()
}
let name = request.parameters["name"] ?? ""
let encoder = JSONEncoder()
let profile = profileStore[name]
var data: Data
do {
data = try encoder.encode(profile)
} catch let error {
response.status(.unprocessableEntity)
response.send(error)
next()
}
response.send(data)
next()
}
router.get(ā€œ/profile", handler: getProfile)
func getProfile(request: RouterRequest, response: RouterResponse, next: @escaping () -> Void)
{
guard let contentType = request.headers["Content-Type"],
contentType.hasPrefix("application/json") else {
response.status(.unsupportedMediaType)
response.send(error)
return next()
}
let name = request.parameters["name"] ?? ""
let encoder = JSONEncoder()
let profile = profileStore[name]
var data: Data
do {
data = try encoder.encode(profile)
} catch let error {
response.status(.unprocessableEntity)
response.send(error)
next()
}
response.send(data)
next()
}
Web Request
router.get(ā€œ/profile", handler: getProfile)
func getProfile(request: RouterRequest, response: RouterResponse, next: @escaping () -> Void)
{
guard let contentType = request.headers["Content-Type"],
contentType.hasPrefix("application/json") else {
response.status(.unsupportedMediaType)
response.send(error)
return next()
}
let name = request.parameters["name"] ?? ""
let encoder = JSONEncoder()
let profile = profileStore[name]
var data: Data
do {
data = try encoder.encode(profile)
} catch let error {
response.status(.unprocessableEntity)
response.send(error)
next()
}
response.send(data)
next()
}
Web Request
Web Response
router.get(ā€œ/profile", handler: getProfile)
func getProfile(request: RouterRequest, response: RouterResponse, next: @escaping () -> Void)
{
guard let contentType = request.headers["Content-Type"],
contentType.hasPrefix("application/json") else {
response.status(.unsupportedMediaType)
response.send(error)
return next()
}
let name = request.parameters["name"] ?? ""
let encoder = JSONEncoder()
let profile = profileStore[name]
var data: Data
do {
data = try encoder.encode(profile)
} catch let error {
response.status(.unprocessableEntity)
response.send(error)
next()
}
response.send(data)
next()
}
Web Request
Web Response
Validate and
Convert parameters
router.get(ā€œ/profile", handler: getProfile)
func getProfile(request: RouterRequest, response: RouterResponse, next: @escaping () -> Void)
{
guard let contentType = request.headers["Content-Type"],
contentType.hasPrefix("application/json") else {
response.status(.unsupportedMediaType)
response.send(error)
return next()
}
let name = request.parameters["name"] ?? ""
let encoder = JSONEncoder()
let profile = profileStore[name]
var data: Data
do {
data = try encoder.encode(profile)
} catch let error {
response.status(.unprocessableEntity)
response.send(error)
next()
}
response.send(data)
next()
}
Web Request
Web Response
Validate and
Convert parameters
Encode and
Send Result
I have to learn
Web Programming?
KITURA
+
Kitura 2.0KituraKit
KITURAKIT
var urlComponents = URLComponents()
urlComponents.scheme = "https"
urlComponents.host = "myhost.myserver.com"
urlComponents.path = ā€œ/profile"
let userIdItem = URLQueryItem(name: "id", value: "(userId)")
urlComponents.queryItems = [userIdItem]
guard let url = urlComponents.url else { fatalError("Could not create URL from components") }
var request = URLRequest(url: url)
request.httpMethod = "GET"
let session = URLSession(configuration: URLSessionConfiguration.default)
let task = session.dataTask(with: request) { (responseData, response, responseError) in
DispatchQueue.main.async {
guard responseError == nil else {
completion?(.failure(responseError!))
}
guard let jsonData = responseData else {
let error = NSError(domain: "", code: 0, userInfo: [NSLocalizedDescriptionKey: ā€œNo data"]) as Error
completion?(.failure(error))
}
let decoder = JSONDecoder()
do {
let person = try decoder.decode(Person.self, from: jsonData)
completion?(.success(person))
} catch {
completion?(.failure(error))
}
}
}
task.resume()
guard let backend = KituraKit(baseURL: "http://localhost:8080") else {
print("Error creating KituraKit client")
return
}
KITURAKIT
guard let backend = KituraKit(baseURL: "http://localhost:8080") else {
print("Error creating KituraKit client")
return
}
backend.get("/profile", id: userId) { (profile: Profile?, error: RequestError?) in
...
}
KITURAKIT
guard let backend = KituraKit(baseURL: "http://localhost:8080") else {
print("Error creating KituraKit client")
return
}
backend.get("/profile", id: userId) { (profile: Profile?, error: RequestError?) in
...
}
KITURAKIT
Swift Type
(Identifier)
guard let backend = KituraKit(baseURL: "http://localhost:8080") else {
print("Error creating KituraKit client")
return
}
backend.get("/profile", id: userId) { (profile: Profile?, error: RequestError?) in
...
}
KITURAKIT
Swift Type
(Codable)
Swift Type
(Identifier)
guard let backend = KituraKit(baseURL: "http://localhost:8080") else {
print("Error creating KituraKit client")
return
}
backend.get("/profile", id: userId) { (profile: Profile?, error: RequestError?) in
...
}
KITURAKIT
Swift Type
(Codable)
Swift Type
(RequestError)Swift Type
(Identifier)
KITURA
KITURA 2.0
router.get(ā€œ/profile", handler: getProfile)
func getProfile(request: RouterRequest, response: RouterResponse, next: @escaping () -> Void)
{
guard let contentType = request.headers["Content-Type"],
contentType.hasPrefix("application/json") else {
response.status(.unsupportedMediaType)
response.send(error)
return next()
}
let name = request.parameters["name"] ?? ""
let encoder = JSONEncoder()
let profile = profileStore[name]
var data: Data
do {
data = try encoder.encode(profile)
} catch let error {
response.status(.unprocessableEntity)
response.send(error)
next()
}
response.send(data)
next()
}
router.get(ā€œ/profileā€) { (userId: Int, respondWith: @escaping (Profile?, RequestError?) -> Void) in
...
}
KITURA
KITURA 2.0
router.get(ā€œ/profileā€) { (userId: Int, respondWith: @escaping (Profile?, RequestError?) -> Void) in
...
}
Swift Type
(Identifier)
KITURA
KITURA 2.0
router.get(ā€œ/profileā€) { (userId: Int, respondWith: @escaping (Profile?, RequestError?) -> Void) in
...
}
Swift Type
(Codable)
Swift Type
(Identifier)
KITURA
KITURA 2.0
router.get(ā€œ/profileā€) { (userId: Int, respondWith: @escaping (Profile?, RequestError?) -> Void) in
...
}
Swift Type
(Codable)
Swift Type
(RequestError)
Swift Type
(Identifier)
KITURA
KITURA 2.0
Icons made by Freepik fromĀ www.flaticon.com
Icons made by Freepik fromĀ www.flaticon.com
Can I use it in
for real apps?
Commercial Support
for Swift and Kiturafrom
from
IBM Cloud
Commercial Support
for Swift and Kitura
Become a SwiftStack
Developer Today

kitura.io
Become a SwiftStack
Developer Today

kitura.ioswift-at-ibm-slack

.mybluemix.net
Become a SwiftStack
Developer Today

kitura.io github.com/ibm-swiftswift-at-ibm-slack

.mybluemix.net
Join IBM
http://ibmreferrals.reppify.com/

Try!Swift India 2017: All you need is Swift

  • 1.
    All you needis SwiftSafe | Expressive | Fast Chris Bailey @Chris__Bailey AB Vijay Kumar @abvijaykumar
  • 2.
    We delivered >100apps that change the way people work We created Accelerators for iOS custom app delivery We now bring everything together for enterprise wide integration of iOS app services In July 2014 Apple and IBM announced a partnership to transform enterprise mobility.
  • 3.
  • 4.
    PUBLIC NETWORK CLOUDNETWORK ENTERPRISE NETWORK Mobile App EDGE SERVICES LOAD BALANCER CONNECTIVITY ENTERPRISE APPLICATION Mobile Services Enterprise Integration DevOps Services MOBILE MIDDLEWARE PUSN NOTIFICATION MOBILE DATA STOREMOBILE SECURITY API MANAGEMENT STORAGE MOBILE ANALYTICS Data Services NOTIFICATION SERVICE PROVIDER API Services CLIENT FIREWALL MOBILE APP LIFECYCLE CONTINUOUS RELEASE CONTINUOUS BUSINESS PLANNING CONTINUOUS MONITORING & FEEDBACK CONFIGURATION MANAGEMENT CONTINUOUS DEPLOYMENT CACHING ENTERPRISE DATA ENTERPRISE DIRECTORY API INTEGRATION
  • 5.
    Rapid App Development FullStack Development Scalable & High performance Mobile backend Easy Integration with other Cloud Services & Backend System
  • 6.
    Rapid App Development FullStack Development Scalable & High performance Mobile backend Easy Integration with other Cloud Services & Backend System
  • 8.
    Mouse Maze Free:Ā© Top Free Games
  • 9.
    Mouse Maze Free:Ā© Top Free Games
  • 10.
    Mouse Maze Free:Ā© Top Free Games
  • 11.
    Mouse Maze Free:Ā© Top Free Games
  • 12.
  • 13.
  • 14.
    Icons made byFreepik fromĀ www.flaticon.com
  • 15.
    Icons made byFreepik fromĀ www.flaticon.com
  • 16.
    Icons made byFreepik fromĀ www.flaticon.com
  • 17.
    struct Profile { varname: String var photo: Data var dateOfBirth: Date } Swift
  • 18.
    { "name": "", "photo": "", "dateOfBirth":"" } { "name": "", "photo": "", "dateOfBirth": "" } struct Profile { var name: String var photo: Data var dateOfBirth: Date } Swift
  • 19.
    Swift parsed = JSON.parse(data) name= parsed["name"] photo = parsed["photo"] dateOfBirth = parsed["dateOfBirth"] Node.js struct Profile { var name: String var photo: Data var dateOfBirth: Date } { "name": "", "photo": "", "dateOfBirth": "" }
  • 20.
    parsed = JSON.parse(data) name= parsed["name"] photo = parsed["photo"] dateOfBirth = parsed["dateOfBirth"] { "name": "", "photo": "", "dateOfBirth": "" } struct Profile { var name: String var photo: Data var dateOfBirth: Date } Swift Node.js
  • 21.
    parsed = JSON.parse(data) name= parsed["name"] photo = parsed["photo"] dateOfBirth = parsed["dateOfBirth"] { "name": "", "photo": "", "dateOfBirth": "" } struct Profile { var name: String var photo: Data var dateOfBirth: Date } Swift Node.js Data
  • 22.
    parsed = JSON.parse(data) name= parsed["name"] photo = parsed["photo"] dateOfBirth = parsed["dateOfBirth"] { "name": "", "photo": "", "dateOfBirth": "" } struct Profile { var name: String var photo: Data var dateOfBirth: Date } Swift Node.js Data String
  • 23.
    parsed = JSON.parse(data) name= parsed["name"] photo = parsed["photo"] dateOfBirth = parsed["dateOfBirth"] { "name": "", "photo": "", "dateOfBirth": "" } struct Profile { var name: String var photo: Data var dateOfBirth: Date } Swift Node.js Data String String of data
  • 24.
    parsed = JSON.parse(data) name= parsed["name"] photo = parsed["photo"] dateOfBirth = parsed["dateOfBirth"] { "name": "", "photo": "", "dateOfBirth": "" } struct Profile { var name: String var photo: Data var dateOfBirth: Date } Swift Node.js
  • 25.
    parsed = JSON.parse(data) name= parsed["name"] photo = parsed["photo"] dateOfBirth = parsed["dateOfBirth"] { "name": "", "photo": "", "dateOfBirth": "" } struct Profile { var name: String var photo: Data var dateOfBirth: Date } Swift Node.js Date
  • 26.
    parsed = JSON.parse(data) name= parsed["name"] photo = parsed["photo"] dateOfBirth = parsed["dateOfBirth"] { "name": "", "photo": "", "dateOfBirth": "" } struct Profile { var name: String var photo: Data var dateOfBirth: Date } Swift Node.js Date String
  • 27.
    parsed = JSON.parse(data) name= parsed["name"] photo = parsed["photo"] dateOfBirth = parsed["dateOfBirth"] { "name": "", "photo": "", "dateOfBirth": "" } struct Profile { var name: String var photo: Data var dateOfBirth: Date } Swift Node.js Date String String
  • 28.
    parsed = JSON.parse(data) name= parsed["name"] photo = parsed["photo"] dateOfBirth = parsed["dateOfBirth"] struct Profile { var name: String var photo: Data var dateOfBirth: Date } { "name": "", "photo": "", "dateOfBirth": "" } { "name": "", "photo": "", "dateOfBirth": { "year": "month": "day": } } Swift Node.js Date String
  • 29.
    struct Profile { varname: String var photo: Data var dateOfBirth: Date } { "name": "", "photo": "", "dateOfBirth": "" } { "name": "", "photo": "", "dateOfBirth": { "year": "month": "day": } } Swift parsed = JSON.parse(data) name = parsed["name"] photo = parsed["photo"] dateOfBirth = parsed["dateOfBirth"] year = dateOfBirth["year"] month = dateOfBirth["month"] day = dateOfBirth[ā€œday"] Node.js Date Strings
  • 30.
    I have tolearn Node.js? (or Ruby, Python, Java, etc)
  • 31.
    Swift struct Profile { varname: String var photo: Data var dateOfBirth: Date }
  • 32.
    Swift Swift KITURA struct Profile{ var name: String var photo: Data var dateOfBirth: Date }
  • 33.
    struct Profile: Codable{ var name: String var photo: Data var dateOfBirth: Date } struct Profile: Codable { var name: String var photo: Data var dateOfBirth: Date } Swift Swift KITURA Codable
  • 34.
    struct Profile: Codable{ var name: String var photo: Data var dateOfBirth: Date } Swift Swift KITURA struct Profile: Codable { var name: String var photo: Data var dateOfBirth: Date } struct Profile: Codable { var name: String var photo: Data var dateOfBirth: Date } Shared
  • 35.
    struct Profile: Codable{ var name: String var photo: Data var dateOfBirth: Date } Swift Swift let encoder = JSONEncoder() let data = try encoder.encode(profile) KITURA struct Profile: Codable { var name: String var photo: Data var dateOfBirth: Date } struct Profile: Codable { var name: String var photo: Data var dateOfBirth: Date }
  • 36.
    struct Profile: Codable{ var name: String var photo: Data var dateOfBirth: Date } Swift Swift let decoder = JSONDecoder() let person = try decoder.decode(Person.self, from: jsonData) KITURA struct Profile: Codable { var name: String var photo: Data var dateOfBirth: Date } struct Profile: Codable { var name: String var photo: Data var dateOfBirth: Date }
  • 37.
    { "name": "", "photo": "", "dateOfBirth":"" } { "name": "", "photo": "", "dateOfBirth": "" } struct Profile: Codable { var name: String var photo: Data var dateOfBirth: Date } Swift Swift KITURA struct Profile: Codable { var name: String var photo: Data var dateOfBirth: Date } struct Profile: Codable { var name: String var photo: Data var dateOfBirth: Date }
  • 38.
    struct Profile: Codable{ var name: String var photo: Data var dateOfBirth: Date } Swift Swift struct Profile: Codable { var name: String var photo: Data var dateOfBirth: Date } KITURA struct Profile: Codable { var name: String var photo: Data var dateOfBirth: Date }
  • 40.
  • 41.
  • 42.
    Icons made byFreepik fromĀ www.flaticon.com
  • 43.
    Icons made byFreepik fromĀ www.flaticon.com
  • 44.
    Fetch the Profilefor a user from the Backend
  • 46.
    var urlComponents =URLComponents() urlComponents.scheme = "https" urlComponents.host = "myhost.myserver.com" urlComponents.path = ā€œ/profile" Set up Backend URL
  • 47.
    var urlComponents =URLComponents() urlComponents.scheme = "https" urlComponents.host = "myhost.myserver.com" urlComponents.path = ā€œ/profile" let userIdItem = URLQueryItem(name: "id", value: "(userId)") urlComponents.queryItems = [userIdItem] guard let url = urlComponents.url else { fatalError("Could not create URL from components") } Set up Person ID
  • 48.
    var urlComponents =URLComponents() urlComponents.scheme = "https" urlComponents.host = "myhost.myserver.com" urlComponents.path = ā€œ/profile" let userIdItem = URLQueryItem(name: "id", value: "(userId)") urlComponents.queryItems = [userIdItem] guard let url = urlComponents.url else { fatalError("Could not create URL from components") } var request = URLRequest(url: url) request.httpMethod = "GET" Set up ā€œGETā€ request
  • 49.
    var urlComponents =URLComponents() urlComponents.scheme = "https" urlComponents.host = "myhost.myserver.com" urlComponents.path = ā€œ/profile" let userIdItem = URLQueryItem(name: "id", value: "(userId)") urlComponents.queryItems = [userIdItem] guard let url = urlComponents.url else { fatalError("Could not create URL from components") } var request = URLRequest(url: url) request.httpMethod = "GET" let session = URLSession(configuration: URLSessionConfiguration.default) let task = session.dataTask(with: request) { (responseData, response, responseError) in } task.resume() Set up URLSession
  • 50.
    var urlComponents =URLComponents() urlComponents.scheme = "https" urlComponents.host = "myhost.myserver.com" urlComponents.path = ā€œ/profile" let userIdItem = URLQueryItem(name: "id", value: "(userId)") urlComponents.queryItems = [userIdItem] guard let url = urlComponents.url else { fatalError("Could not create URL from components") } var request = URLRequest(url: url) request.httpMethod = "GET" let session = URLSession(configuration: URLSessionConfiguration.default) let task = session.dataTask(with: request) { (responseData, response, responseError) in } task.resume() Web Request Web Response Error Call URLSession
  • 51.
    var urlComponents =URLComponents() urlComponents.scheme = "https" urlComponents.host = "myhost.myserver.com" urlComponents.path = ā€œ/profile" let userIdItem = URLQueryItem(name: "id", value: "(userId)") urlComponents.queryItems = [userIdItem] guard let url = urlComponents.url else { fatalError("Could not create URL from components") } var request = URLRequest(url: url) request.httpMethod = "GET" let session = URLSession(configuration: URLSessionConfiguration.default) let task = session.dataTask(with: request) { (responseData, response, responseError) in DispatchQueue.main.async { guard responseError == nil else { completion?(.failure(responseError!)) } guard let jsonData = responseData else { let error = NSError(domain: "", code: 0, userInfo: [NSLocalizedDescriptionKey: ā€œNo data"]) as Error completion?(.failure(error)) } } } task.resume() Error Checking
  • 52.
    var urlComponents =URLComponents() urlComponents.scheme = "https" urlComponents.host = "myhost.myserver.com" urlComponents.path = ā€œ/profile" let userIdItem = URLQueryItem(name: "id", value: "(userId)") urlComponents.queryItems = [userIdItem] guard let url = urlComponents.url else { fatalError("Could not create URL from components") } var request = URLRequest(url: url) request.httpMethod = "GET" let session = URLSession(configuration: URLSessionConfiguration.default) let task = session.dataTask(with: request) { (responseData, response, responseError) in DispatchQueue.main.async { guard responseError == nil else { completion?(.failure(responseError!)) } guard let jsonData = responseData else { let error = NSError(domain: "", code: 0, userInfo: [NSLocalizedDescriptionKey: ā€œNo data"]) as Error completion?(.failure(error)) } let decoder = JSONDecoder() do { let person = try decoder.decode(Profile.self, from: jsonData) completion?(.success(person)) } catch { completion?(.failure(error)) } } } task.resume() Convert Response
  • 54.
    router.get(ā€œ/profile", handler: getProfile) funcgetProfile(request: RouterRequest, response: RouterResponse, next: @escaping () -> Void) { guard let contentType = request.headers["Content-Type"], contentType.hasPrefix("application/json") else { response.status(.unsupportedMediaType) response.send(error) return next() } let name = request.parameters["name"] ?? "" let encoder = JSONEncoder() let profile = profileStore[name] var data: Data do { data = try encoder.encode(profile) } catch let error { response.status(.unprocessableEntity) response.send(error) next() } response.send(data) next() }
  • 55.
    router.get(ā€œ/profile", handler: getProfile) funcgetProfile(request: RouterRequest, response: RouterResponse, next: @escaping () -> Void) { guard let contentType = request.headers["Content-Type"], contentType.hasPrefix("application/json") else { response.status(.unsupportedMediaType) response.send(error) return next() } let name = request.parameters["name"] ?? "" let encoder = JSONEncoder() let profile = profileStore[name] var data: Data do { data = try encoder.encode(profile) } catch let error { response.status(.unprocessableEntity) response.send(error) next() } response.send(data) next() } Web Request
  • 56.
    router.get(ā€œ/profile", handler: getProfile) funcgetProfile(request: RouterRequest, response: RouterResponse, next: @escaping () -> Void) { guard let contentType = request.headers["Content-Type"], contentType.hasPrefix("application/json") else { response.status(.unsupportedMediaType) response.send(error) return next() } let name = request.parameters["name"] ?? "" let encoder = JSONEncoder() let profile = profileStore[name] var data: Data do { data = try encoder.encode(profile) } catch let error { response.status(.unprocessableEntity) response.send(error) next() } response.send(data) next() } Web Request Web Response
  • 57.
    router.get(ā€œ/profile", handler: getProfile) funcgetProfile(request: RouterRequest, response: RouterResponse, next: @escaping () -> Void) { guard let contentType = request.headers["Content-Type"], contentType.hasPrefix("application/json") else { response.status(.unsupportedMediaType) response.send(error) return next() } let name = request.parameters["name"] ?? "" let encoder = JSONEncoder() let profile = profileStore[name] var data: Data do { data = try encoder.encode(profile) } catch let error { response.status(.unprocessableEntity) response.send(error) next() } response.send(data) next() } Web Request Web Response Validate and Convert parameters
  • 58.
    router.get(ā€œ/profile", handler: getProfile) funcgetProfile(request: RouterRequest, response: RouterResponse, next: @escaping () -> Void) { guard let contentType = request.headers["Content-Type"], contentType.hasPrefix("application/json") else { response.status(.unsupportedMediaType) response.send(error) return next() } let name = request.parameters["name"] ?? "" let encoder = JSONEncoder() let profile = profileStore[name] var data: Data do { data = try encoder.encode(profile) } catch let error { response.status(.unprocessableEntity) response.send(error) next() } response.send(data) next() } Web Request Web Response Validate and Convert parameters Encode and Send Result
  • 59.
    I have tolearn Web Programming?
  • 60.
  • 61.
    KITURAKIT var urlComponents =URLComponents() urlComponents.scheme = "https" urlComponents.host = "myhost.myserver.com" urlComponents.path = ā€œ/profile" let userIdItem = URLQueryItem(name: "id", value: "(userId)") urlComponents.queryItems = [userIdItem] guard let url = urlComponents.url else { fatalError("Could not create URL from components") } var request = URLRequest(url: url) request.httpMethod = "GET" let session = URLSession(configuration: URLSessionConfiguration.default) let task = session.dataTask(with: request) { (responseData, response, responseError) in DispatchQueue.main.async { guard responseError == nil else { completion?(.failure(responseError!)) } guard let jsonData = responseData else { let error = NSError(domain: "", code: 0, userInfo: [NSLocalizedDescriptionKey: ā€œNo data"]) as Error completion?(.failure(error)) } let decoder = JSONDecoder() do { let person = try decoder.decode(Person.self, from: jsonData) completion?(.success(person)) } catch { completion?(.failure(error)) } } } task.resume()
  • 62.
    guard let backend= KituraKit(baseURL: "http://localhost:8080") else { print("Error creating KituraKit client") return } KITURAKIT
  • 63.
    guard let backend= KituraKit(baseURL: "http://localhost:8080") else { print("Error creating KituraKit client") return } backend.get("/profile", id: userId) { (profile: Profile?, error: RequestError?) in ... } KITURAKIT
  • 64.
    guard let backend= KituraKit(baseURL: "http://localhost:8080") else { print("Error creating KituraKit client") return } backend.get("/profile", id: userId) { (profile: Profile?, error: RequestError?) in ... } KITURAKIT Swift Type (Identifier)
  • 65.
    guard let backend= KituraKit(baseURL: "http://localhost:8080") else { print("Error creating KituraKit client") return } backend.get("/profile", id: userId) { (profile: Profile?, error: RequestError?) in ... } KITURAKIT Swift Type (Codable) Swift Type (Identifier)
  • 66.
    guard let backend= KituraKit(baseURL: "http://localhost:8080") else { print("Error creating KituraKit client") return } backend.get("/profile", id: userId) { (profile: Profile?, error: RequestError?) in ... } KITURAKIT Swift Type (Codable) Swift Type (RequestError)Swift Type (Identifier)
  • 67.
    KITURA KITURA 2.0 router.get(ā€œ/profile", handler:getProfile) func getProfile(request: RouterRequest, response: RouterResponse, next: @escaping () -> Void) { guard let contentType = request.headers["Content-Type"], contentType.hasPrefix("application/json") else { response.status(.unsupportedMediaType) response.send(error) return next() } let name = request.parameters["name"] ?? "" let encoder = JSONEncoder() let profile = profileStore[name] var data: Data do { data = try encoder.encode(profile) } catch let error { response.status(.unprocessableEntity) response.send(error) next() } response.send(data) next() }
  • 68.
    router.get(ā€œ/profileā€) { (userId:Int, respondWith: @escaping (Profile?, RequestError?) -> Void) in ... } KITURA KITURA 2.0
  • 69.
    router.get(ā€œ/profileā€) { (userId:Int, respondWith: @escaping (Profile?, RequestError?) -> Void) in ... } Swift Type (Identifier) KITURA KITURA 2.0
  • 70.
    router.get(ā€œ/profileā€) { (userId:Int, respondWith: @escaping (Profile?, RequestError?) -> Void) in ... } Swift Type (Codable) Swift Type (Identifier) KITURA KITURA 2.0
  • 71.
    router.get(ā€œ/profileā€) { (userId:Int, respondWith: @escaping (Profile?, RequestError?) -> Void) in ... } Swift Type (Codable) Swift Type (RequestError) Swift Type (Identifier) KITURA KITURA 2.0
  • 72.
    Icons made byFreepik fromĀ www.flaticon.com
  • 73.
    Icons made byFreepik fromĀ www.flaticon.com
  • 74.
    Can I useit in for real apps?
  • 75.
  • 76.
  • 77.
    Become a SwiftStack DeveloperToday
 kitura.io
  • 78.
    Become a SwiftStack DeveloperToday
 kitura.ioswift-at-ibm-slack
 .mybluemix.net
  • 79.
    Become a SwiftStack DeveloperToday
 kitura.io github.com/ibm-swiftswift-at-ibm-slack
 .mybluemix.net
  • 80.