Type-safe Web APIs with
Protocol Buffers in Swift
1 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
Hi, I'm Yusuke
@kitasuke
2 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
I'm going to talk about...
→ What Protocol Buffers are
3 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
I'm going to talk about...
→ What Protocol Buffers are
→ Pros and Cons
4 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
I'm going to talk about...
→ What Protocol Buffers are
→ Pros and Cons
→ Where to start
5 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
Web APIs
6 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
JSON7 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
HTTP Request
JSON ➡ Data
8 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
let json = ["id": 1]
let data = try? JSONSerialization.data(
withJSONObject: json,
options: []
)
var request = URLRequest(url: url)
request.httpBody = data
9 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
HTTP Response
Data ➡ JSON
10 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
// {"user": {"name": "Yusuke"}}
URLSession.shared.dataTask(with: request) { (data, _, _) in
let json = (try? JSONSerialization.jsonObject(
with: data!,
options: []
)) as? [String: Any]
let user = json?["user"] as? [String: Any]
let name = user?["name"] as? String
}
11 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
{"isTyped": false,
"status": "disappointed"}
12 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
[AnyHashable: Any]
13 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
Any?
14 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
!
15 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
Protocol
Buffersa.k.a protobuf
16 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
Protocol buffers are Google's language-neutral,
platform-neutral, extensible mechanism for
serializing structured data – think XML, but smaller,
faster, and simpler.
— Google
17 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
Serialization format
- think JSON, but
smaller, faster and safer
— Yusuke
18 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
Serialization
Format
19 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
Why are Protocol Buffers
a big deal?
20 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
HTTP Request
JSON ➡ Data
21 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
let json = ["id": 1]
let data = try? JSONSerialization.data(
withJSONObject: json,
options: []
)
var request = URLRequest(url: url)
request.httpBody = data
22 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
HTTP Request
JSON ➡ Data
23 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
HTTP Request
UserRequest ➡ Data
24 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
// custom type
let userRequest = UserRequest.with {
$0.id = 1
}
let body = try? userRequest.serializedData()
var request = URLRequest(url: url)
request.httpBody = body
25 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
HTTP Response
Data ➡ JSON
26 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
// {"user": {"name": "Yusuke"}}
URLSession.shared.dataTask(with: request) { (data, _, _) in
let json = (try? JSONSerialization.jsonObject(
with: data!,
options: []
)) as? [String: Any]
let user = json?["user"] as? [String: Any]
let name = user?["name"] as? String
}
27 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
HTTP Response
Data ➡ JSON
28 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
HTTP Response
Data ➡ UserResponse
29 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
// UserResponse(user: User(name: "Yusuke"))
URLSession.shared.dataTask(with: request) { (data, _, _) in
// custom type
guard let response = try? UserResponse(serializedData: data!) else {
// error
return
}
let user = response.user
let name = user.name
}
30 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
Protobuf(
isTyped: true,
status: .happy
)
31 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
!
32 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
But how do
they work?
33 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
protobuf
google/protobuf
34 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
protobuf for Swift
apple/swift-protobuf
35 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
"But we still use
Objective-C !"
36 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
1. Define message types
2. Generate code
3. Serialize/Deserialize
37 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
1. Define message types
2. Generate code
3. Serialize/Deserialize
38 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
Message types define
data structures
in .proto files
39 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
Message types have key-
value pairs
40 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
41 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
user.proto
syntax = "proto3"; // protoc version
message User {
int32 id = 1; // field number
string name = 2;
string introduction = 3;
string photoUrl = 4;
Type type = 5;
enum Type {
Speaker = 0;
Attendee = 1;
}
}
42 — Type-safe Web APIs with Protocol Buffers in Swift,
Yusuke Kita (@kitasuke), AltConf 2017
talk.proto
syntax = "proto3";
import "user.proto";
message Talk {
int32 id = 1;
string title = 2;
string desc = 3;
User speaker = 4;
repeated string tags = 5; // Array
}
43 — Type-safe Web APIs with Protocol Buffers in Swift,
Yusuke Kita (@kitasuke), AltConf 2017
1. Define message types
2. Generate code
3. Serialize/Deserialize
44 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
protobuf compiler
generates code
from .proto file
45 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
Basic types
Int32, UInt32, Int64, UInt64, Bool, Float, Double, String,
Array, Dictionary, Data
46 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
Supported languages
C, C++, C#, Go, Haskell, Java, Javascript, Objective-C,
PHP, Python, Ruby, Rust, Scala, Swift etc.
47 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
Swift features
→ struct, not class
→ enum RawValue is Int
→ Default value is set
48 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
49 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
user.proto
syntax = "proto3"; // protoc version
message User {
int32 id = 1; // field number
string name = 2;
string introduction = 3;
string photoUrl = 4;
Type type = 5;
enum Type {
Speaker = 0;
Attendee = 1;
}
}
50 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
user.pb.swift
// struct
struct User: SwiftProtobuf.Message, ... {
init() {}
enum Type: SwiftProtobuf.Enum {
typealias RawValue = Int // always Int
case speaker // = 0
case attendee // = 1
case UNRECOGNIZED(Int)
}
// property has default value
var id: Int32 = 0
var name: String = String()
var introduction: String = String()
var photoURL: String = String()
var type: User.TypeEnum = .speaker
}
51 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
talk.proto
syntax = "proto3";
import "user.proto";
message Talk {
int32 id = 1;
string title = 2;
string desc = 3;
User speaker = 4;
repeated string tags = 5; // Array
}
52 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
talk.pb.swift
struct Talk: SwiftProtobuf.Message, ... {
init() {}
var id: Int32 = 0
var title: String = String()
var speaker: User = User()
var desc: String = String()
var tags: [String] = []
}
53 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
54 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
User.java
public static final class User extends Message<User, User.Builder> {
public final Integer id;
public final String name;
public final String introduction;
public final String photoUrl;
public final Type type;
}
55 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
Talk.java
public final class Talk extends Message<Talk, Talk.Builder> {
public final Integer id;
public final String title;
public final User speaker;
public final String summary;
public final List<String> tags;
}
56 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
57 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
user.pb.go
type User_Type int32
const (
User_Speaker User_Type = 0
User_Attendee User_Type = 1
)
type User struct {
ID int32 ˆprotobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"ˆ
Name string ˆprotobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"ˆ
Introduction string ˆprotobuf:"bytes,3,opt,name=introduction,proto3" json:"introduction,omitempty"ˆ
PhotoURL string ˆprotobuf:"bytes,4,opt,name=photoUrl,proto3" json:"photoUrl,omitempty"ˆ
Type User_Type ˆprotobuf:"varint,5,opt,name=type,proto3,enum=api.User_Type" json:"type,omitempty"ˆ
}
58 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
talk.pb.go
type Talk struct {
ID int32 ˆprotobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"ˆ
Title string ˆprotobuf:"bytes,2,opt,name=title,proto3" json:"title,omitempty"ˆ
Speaker *User ˆprotobuf:"bytes,3,opt,name=speaker" json:"speaker,omitempty"ˆ
Summary string ˆprotobuf:"bytes,4,opt,name=summary,proto3" json:"summary,omitempty"ˆ
Tags []string ˆprotobuf:"bytes,5,rep,name=tags" json:"tags,omitempty"ˆ
}
59 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
One message type
⬇
Multiple languages code
60 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
Less communication,
More collaboration
with other platforms
61 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
1. Define message types
2. Generate source files
3. Serialize/Deserialize
62 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
Serialization
public func serializedData(partial: Bool = default) throws -> Data
public func jsonString() throws -> String
public func textFormatString() throws -> String
63 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
let user = User.with {
$0.id = 1
$0.type = .speaker
$0.name = "kitasuke"
}
let talk = Talk.with {
$0.id = 1
$0.title = "Type-safe Web APIs with Protocol Buffers in Swift"
$0.speaker = user
$0.tags = ["swift", "iOS", "protocol-buffers", "altconf", "type-safe"]
}
let data = try? talk.serializedData()
64 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
Deserialization
public convenience init(serializedData data: Data,
extensions: ExtensionMap = default,
partial: Bool = default) throws
public convenience init(jsonString: String) throws
public convenience init(jsonUTF8Data: Data) throws
public convenience init(textFormatString: String,
extensions: ExtensionMap? = default) throws
65 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
let talk = try? Talk(serializedData: data)
let title = talk?.title
let speaker = talk?.speaker
let tags = talk?.tags
66 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
How serialization works
67 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
Binary
Encoding
68 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
Key factor
1. Field number
2. Wire type
69 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
Field number
message Talk {
int32 id = 1; ← // Field number
string title = 2;
string desc = 3;
User speaker = 4;
repeated string tags = 5;
}
70 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
Wire type
Type Meaning Used For
0 Varint int32, int64, uint32, uint64,
sint32, sint64, bool, enum
1 64-bit fixed64, sfixed64, double
2 Length-delimited string, bytes, embedded
messages, packed
repeated fields
3 (deprecated)
4 (deprecated)
5 32-bit fixed32, sfix3d32, float
71 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
// message type
message Test1 {
int32 a = 1;
}
test1.a = 300
// encoded message
08 96 01
08 // field number and wire type
96 01 // value which is 300
72 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
Small and Numeric
73 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
High network
performance
74 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
Demo
kitasuke/SwiftProtobufSample
75 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
Quick Recap
76 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
Quick Recap
→ Type-safety
77 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
Quick Recap
→ Type-safety
→ Shared data model
78 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
Quick Recap
→ Type-safety
→ Shared data model
→ High performance
79 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
You might have concerns
about...
80 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
Versioning
81 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
Backward compatibility
→ Unknown field is ignored
→ Default value for missing field
82 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
Backward compatibility
→ Unknown field is ignored
→ Default value for missing field
as long as you don't change existing field number or wire type
83 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
Coexistence of
protobuf & JSON
84 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
Absolutely you can!
85 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
Accept & Content-Type
→ application/protobuf - protobuf
→ application/json - JSON
86 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
HTTP Request
var request = URLRequest(url: url)
if protobuf {
request.setValue("application/protobuf", forHTTPHeaderField: "Content-Type")
request.setValue("application/protobuf", forHTTPHeaderField: "Accept")
} else if json {
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.setValue("application/json", forHTTPHeaderField: "Accept")
}
request.body = try? userRequest.serializedData()
87 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
HTTP Response
URLSession.shared.dataTask(with: request) { (data, urlResponse, _) in
let httpURLResponse = urlResponse as? HTTPURLResponse
let contentType = httpURLResponse?.allHeaderFields["Content-Type"] as? String
let response: Response?
if contentType == "application/protobuf" {
response = try? Response(serializedData: data!)
} else if contentType == "application/json" {
response = try? Response(jsonUTF8Data: data!)
}
}
88 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
Sounds good
so far !
89 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
So, what are
Cons?
90 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
Not human-readable
→ Binary data is not understandable
91 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
Time investment
→ Time consuming at the beginning
→ Involvement from other platforms
92 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
Swift version
→ Watch Swift version of protobuf plugin
→ Specify tag version if you use older version
93 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
Stability
→ Still pre-release version only for Swift
→ Contribute if you find a bug !
94 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
Where should
we start?
95 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
Internal service
→ Easy to adapt
→ Small start
96 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
Data store
→ Database
→ NSKeyedArchiver
→ NSCache
97 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
Parsing library
→ JSON parser
→ Server side Swift
98 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
Conclusion
99 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
Conclusion
→ Swifty
100 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
Conclusion
→ Swifty
→ Consistent in Cross-platform
101 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
Conclusion
→ Swifty
→ Consistent in Cross-platform
→ Better performance
102 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
It's definitely
worth it !
103 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
In Production
70M Downloads
!"#
104 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
One more thing...
105 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
Codable !
106 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
/// A type that can convert itself into and out of an external representation.
public typealias Codable = Decodable & Encodable
107 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
/// A type that can encode itself to an external representation.
public protocol Encodable {
/// Encodes this value into the given encoder.
///
/// If the value fails to encode anything, ˆencoderˆ will encode an empty
/// keyed container in its place.
///
/// This function throws an error if any values are invalid for the given
/// encoder's format.
///
/// - Parameter encoder: The encoder to write data to.
public func encode(to encoder: Encoder) throws
}
108 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
/// A type that can decode itself from an external representation.
public protocol Decodable {
/// Creates a new instance by decoding from the given decoder.
///
/// This initializer throws an error if reading from the decoder fails, or
/// if the data read is corrupted or otherwise invalid.
///
/// - Parameter decoder: The decoder to read data from.
public init(from decoder: Decoder) throws
}
109 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
struct UserRequest: Codable {
let id: Int
}
let encoder = JSONEncoder()
let userRequest = UserRequest(id: 1)
let data = try? encoder.encode(userRequest)
110 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
struct UserResponse: Codable {
let user: User
struct User: Codable {
let name: String
}
}
let decoder = JSONDecoder()
let response = try? decoder.decode(UserResponse.self, from: data)
let name = response?.user.name
111 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
struct NetworkError: Codable {
let code: Code
enum Code: Int, Codable {
case unknown = 0
case badRequest = 400
case unauthorized = 401
case forbidden = 403
case notFound = 404
case internalServerError = 500
}
}
let decoder = JSONDecoder()
let response = try? decoder.decode(NetworkError.self, from: data)
let code = response?.code
112 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
Codable(
isTyped: true,
status: .excited
)
113 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
Awesome !
114 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
Credits
Protocol Buffers
swift-protobuf
Kitura
Protocol Buffers in your Kitura Apps
115 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
Thank you!
GitHub: https://github.com/kitasuke
Demo: SwiftProtobufSample
Twitter: @kitasuke
Email: yusuke2759@gmail.com
116 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017

Type-safe Web APIs with Protocol Buffers in Swift at AltConf

  • 1.
    Type-safe Web APIswith Protocol Buffers in Swift 1 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 2.
    Hi, I'm Yusuke @kitasuke 2— Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 3.
    I'm going totalk about... → What Protocol Buffers are 3 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 4.
    I'm going totalk about... → What Protocol Buffers are → Pros and Cons 4 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 5.
    I'm going totalk about... → What Protocol Buffers are → Pros and Cons → Where to start 5 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 6.
    Web APIs 6 —Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 7.
    JSON7 — Type-safeWeb APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 8.
    HTTP Request JSON ➡Data 8 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 9.
    let json =["id": 1] let data = try? JSONSerialization.data( withJSONObject: json, options: [] ) var request = URLRequest(url: url) request.httpBody = data 9 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 10.
    HTTP Response Data ➡JSON 10 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 11.
    // {"user": {"name":"Yusuke"}} URLSession.shared.dataTask(with: request) { (data, _, _) in let json = (try? JSONSerialization.jsonObject( with: data!, options: [] )) as? [String: Any] let user = json?["user"] as? [String: Any] let name = user?["name"] as? String } 11 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 12.
    {"isTyped": false, "status": "disappointed"} 12— Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 13.
    [AnyHashable: Any] 13 —Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 14.
    Any? 14 — Type-safeWeb APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 15.
    ! 15 — Type-safeWeb APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 16.
    Protocol Buffersa.k.a protobuf 16 —Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 17.
    Protocol buffers areGoogle's language-neutral, platform-neutral, extensible mechanism for serializing structured data – think XML, but smaller, faster, and simpler. — Google 17 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 18.
    Serialization format - thinkJSON, but smaller, faster and safer — Yusuke 18 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 19.
    Serialization Format 19 — Type-safeWeb APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 20.
    Why are ProtocolBuffers a big deal? 20 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 21.
    HTTP Request JSON ➡Data 21 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 22.
    let json =["id": 1] let data = try? JSONSerialization.data( withJSONObject: json, options: [] ) var request = URLRequest(url: url) request.httpBody = data 22 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 23.
    HTTP Request JSON ➡Data 23 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 24.
    HTTP Request UserRequest ➡Data 24 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 25.
    // custom type letuserRequest = UserRequest.with { $0.id = 1 } let body = try? userRequest.serializedData() var request = URLRequest(url: url) request.httpBody = body 25 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 26.
    HTTP Response Data ➡JSON 26 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 27.
    // {"user": {"name":"Yusuke"}} URLSession.shared.dataTask(with: request) { (data, _, _) in let json = (try? JSONSerialization.jsonObject( with: data!, options: [] )) as? [String: Any] let user = json?["user"] as? [String: Any] let name = user?["name"] as? String } 27 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 28.
    HTTP Response Data ➡JSON 28 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 29.
    HTTP Response Data ➡UserResponse 29 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 30.
    // UserResponse(user: User(name:"Yusuke")) URLSession.shared.dataTask(with: request) { (data, _, _) in // custom type guard let response = try? UserResponse(serializedData: data!) else { // error return } let user = response.user let name = user.name } 30 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 31.
    Protobuf( isTyped: true, status: .happy ) 31— Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 32.
    ! 32 — Type-safeWeb APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 33.
    But how do theywork? 33 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 34.
    protobuf google/protobuf 34 — Type-safeWeb APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 35.
    protobuf for Swift apple/swift-protobuf 35— Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 36.
    "But we stilluse Objective-C !" 36 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 37.
    1. Define messagetypes 2. Generate code 3. Serialize/Deserialize 37 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 38.
    1. Define messagetypes 2. Generate code 3. Serialize/Deserialize 38 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 39.
    Message types define datastructures in .proto files 39 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 40.
    Message types havekey- value pairs 40 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 41.
    41 — Type-safeWeb APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 42.
    user.proto syntax = "proto3";// protoc version message User { int32 id = 1; // field number string name = 2; string introduction = 3; string photoUrl = 4; Type type = 5; enum Type { Speaker = 0; Attendee = 1; } } 42 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 43.
    talk.proto syntax = "proto3"; import"user.proto"; message Talk { int32 id = 1; string title = 2; string desc = 3; User speaker = 4; repeated string tags = 5; // Array } 43 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 44.
    1. Define messagetypes 2. Generate code 3. Serialize/Deserialize 44 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 45.
    protobuf compiler generates code from.proto file 45 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 46.
    Basic types Int32, UInt32,Int64, UInt64, Bool, Float, Double, String, Array, Dictionary, Data 46 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 47.
    Supported languages C, C++,C#, Go, Haskell, Java, Javascript, Objective-C, PHP, Python, Ruby, Rust, Scala, Swift etc. 47 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 48.
    Swift features → struct,not class → enum RawValue is Int → Default value is set 48 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 49.
    49 — Type-safeWeb APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 50.
    user.proto syntax = "proto3";// protoc version message User { int32 id = 1; // field number string name = 2; string introduction = 3; string photoUrl = 4; Type type = 5; enum Type { Speaker = 0; Attendee = 1; } } 50 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 51.
    user.pb.swift // struct struct User:SwiftProtobuf.Message, ... { init() {} enum Type: SwiftProtobuf.Enum { typealias RawValue = Int // always Int case speaker // = 0 case attendee // = 1 case UNRECOGNIZED(Int) } // property has default value var id: Int32 = 0 var name: String = String() var introduction: String = String() var photoURL: String = String() var type: User.TypeEnum = .speaker } 51 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 52.
    talk.proto syntax = "proto3"; import"user.proto"; message Talk { int32 id = 1; string title = 2; string desc = 3; User speaker = 4; repeated string tags = 5; // Array } 52 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 53.
    talk.pb.swift struct Talk: SwiftProtobuf.Message,... { init() {} var id: Int32 = 0 var title: String = String() var speaker: User = User() var desc: String = String() var tags: [String] = [] } 53 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 54.
    54 — Type-safeWeb APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 55.
    User.java public static finalclass User extends Message<User, User.Builder> { public final Integer id; public final String name; public final String introduction; public final String photoUrl; public final Type type; } 55 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 56.
    Talk.java public final classTalk extends Message<Talk, Talk.Builder> { public final Integer id; public final String title; public final User speaker; public final String summary; public final List<String> tags; } 56 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 57.
    57 — Type-safeWeb APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 58.
    user.pb.go type User_Type int32 const( User_Speaker User_Type = 0 User_Attendee User_Type = 1 ) type User struct { ID int32 ˆprotobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"ˆ Name string ˆprotobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"ˆ Introduction string ˆprotobuf:"bytes,3,opt,name=introduction,proto3" json:"introduction,omitempty"ˆ PhotoURL string ˆprotobuf:"bytes,4,opt,name=photoUrl,proto3" json:"photoUrl,omitempty"ˆ Type User_Type ˆprotobuf:"varint,5,opt,name=type,proto3,enum=api.User_Type" json:"type,omitempty"ˆ } 58 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 59.
    talk.pb.go type Talk struct{ ID int32 ˆprotobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"ˆ Title string ˆprotobuf:"bytes,2,opt,name=title,proto3" json:"title,omitempty"ˆ Speaker *User ˆprotobuf:"bytes,3,opt,name=speaker" json:"speaker,omitempty"ˆ Summary string ˆprotobuf:"bytes,4,opt,name=summary,proto3" json:"summary,omitempty"ˆ Tags []string ˆprotobuf:"bytes,5,rep,name=tags" json:"tags,omitempty"ˆ } 59 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 60.
    One message type ⬇ Multiplelanguages code 60 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 61.
    Less communication, More collaboration withother platforms 61 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 62.
    1. Define messagetypes 2. Generate source files 3. Serialize/Deserialize 62 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 63.
    Serialization public func serializedData(partial:Bool = default) throws -> Data public func jsonString() throws -> String public func textFormatString() throws -> String 63 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 64.
    let user =User.with { $0.id = 1 $0.type = .speaker $0.name = "kitasuke" } let talk = Talk.with { $0.id = 1 $0.title = "Type-safe Web APIs with Protocol Buffers in Swift" $0.speaker = user $0.tags = ["swift", "iOS", "protocol-buffers", "altconf", "type-safe"] } let data = try? talk.serializedData() 64 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 65.
    Deserialization public convenience init(serializedDatadata: Data, extensions: ExtensionMap = default, partial: Bool = default) throws public convenience init(jsonString: String) throws public convenience init(jsonUTF8Data: Data) throws public convenience init(textFormatString: String, extensions: ExtensionMap? = default) throws 65 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 66.
    let talk =try? Talk(serializedData: data) let title = talk?.title let speaker = talk?.speaker let tags = talk?.tags 66 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 67.
    How serialization works 67— Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 68.
    Binary Encoding 68 — Type-safeWeb APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 69.
    Key factor 1. Fieldnumber 2. Wire type 69 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 70.
    Field number message Talk{ int32 id = 1; ← // Field number string title = 2; string desc = 3; User speaker = 4; repeated string tags = 5; } 70 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 71.
    Wire type Type MeaningUsed For 0 Varint int32, int64, uint32, uint64, sint32, sint64, bool, enum 1 64-bit fixed64, sfixed64, double 2 Length-delimited string, bytes, embedded messages, packed repeated fields 3 (deprecated) 4 (deprecated) 5 32-bit fixed32, sfix3d32, float 71 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 72.
    // message type messageTest1 { int32 a = 1; } test1.a = 300 // encoded message 08 96 01 08 // field number and wire type 96 01 // value which is 300 72 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 73.
    Small and Numeric 73— Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 74.
    High network performance 74 —Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 75.
    Demo kitasuke/SwiftProtobufSample 75 — Type-safeWeb APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 76.
    Quick Recap 76 —Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 77.
    Quick Recap → Type-safety 77— Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 78.
    Quick Recap → Type-safety →Shared data model 78 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 79.
    Quick Recap → Type-safety →Shared data model → High performance 79 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 80.
    You might haveconcerns about... 80 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 81.
    Versioning 81 — Type-safeWeb APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 82.
    Backward compatibility → Unknownfield is ignored → Default value for missing field 82 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 83.
    Backward compatibility → Unknownfield is ignored → Default value for missing field as long as you don't change existing field number or wire type 83 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 84.
    Coexistence of protobuf &JSON 84 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 85.
    Absolutely you can! 85— Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 86.
    Accept & Content-Type →application/protobuf - protobuf → application/json - JSON 86 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 87.
    HTTP Request var request= URLRequest(url: url) if protobuf { request.setValue("application/protobuf", forHTTPHeaderField: "Content-Type") request.setValue("application/protobuf", forHTTPHeaderField: "Accept") } else if json { request.setValue("application/json", forHTTPHeaderField: "Content-Type") request.setValue("application/json", forHTTPHeaderField: "Accept") } request.body = try? userRequest.serializedData() 87 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 88.
    HTTP Response URLSession.shared.dataTask(with: request){ (data, urlResponse, _) in let httpURLResponse = urlResponse as? HTTPURLResponse let contentType = httpURLResponse?.allHeaderFields["Content-Type"] as? String let response: Response? if contentType == "application/protobuf" { response = try? Response(serializedData: data!) } else if contentType == "application/json" { response = try? Response(jsonUTF8Data: data!) } } 88 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 89.
    Sounds good so far! 89 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 90.
    So, what are Cons? 90— Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 91.
    Not human-readable → Binarydata is not understandable 91 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 92.
    Time investment → Timeconsuming at the beginning → Involvement from other platforms 92 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 93.
    Swift version → WatchSwift version of protobuf plugin → Specify tag version if you use older version 93 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 94.
    Stability → Still pre-releaseversion only for Swift → Contribute if you find a bug ! 94 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 95.
    Where should we start? 95— Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 96.
    Internal service → Easyto adapt → Small start 96 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 97.
    Data store → Database →NSKeyedArchiver → NSCache 97 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 98.
    Parsing library → JSONparser → Server side Swift 98 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 99.
    Conclusion 99 — Type-safeWeb APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 100.
    Conclusion → Swifty 100 —Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 101.
    Conclusion → Swifty → Consistentin Cross-platform 101 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 102.
    Conclusion → Swifty → Consistentin Cross-platform → Better performance 102 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 103.
    It's definitely worth it! 103 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 104.
    In Production 70M Downloads !"# 104— Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 105.
    One more thing... 105— Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 106.
    Codable ! 106 —Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 107.
    /// A typethat can convert itself into and out of an external representation. public typealias Codable = Decodable & Encodable 107 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 108.
    /// A typethat can encode itself to an external representation. public protocol Encodable { /// Encodes this value into the given encoder. /// /// If the value fails to encode anything, ˆencoderˆ will encode an empty /// keyed container in its place. /// /// This function throws an error if any values are invalid for the given /// encoder's format. /// /// - Parameter encoder: The encoder to write data to. public func encode(to encoder: Encoder) throws } 108 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 109.
    /// A typethat can decode itself from an external representation. public protocol Decodable { /// Creates a new instance by decoding from the given decoder. /// /// This initializer throws an error if reading from the decoder fails, or /// if the data read is corrupted or otherwise invalid. /// /// - Parameter decoder: The decoder to read data from. public init(from decoder: Decoder) throws } 109 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 110.
    struct UserRequest: Codable{ let id: Int } let encoder = JSONEncoder() let userRequest = UserRequest(id: 1) let data = try? encoder.encode(userRequest) 110 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 111.
    struct UserResponse: Codable{ let user: User struct User: Codable { let name: String } } let decoder = JSONDecoder() let response = try? decoder.decode(UserResponse.self, from: data) let name = response?.user.name 111 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 112.
    struct NetworkError: Codable{ let code: Code enum Code: Int, Codable { case unknown = 0 case badRequest = 400 case unauthorized = 401 case forbidden = 403 case notFound = 404 case internalServerError = 500 } } let decoder = JSONDecoder() let response = try? decoder.decode(NetworkError.self, from: data) let code = response?.code 112 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 113.
    Codable( isTyped: true, status: .excited ) 113— Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 114.
    Awesome ! 114 —Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 115.
    Credits Protocol Buffers swift-protobuf Kitura Protocol Buffersin your Kitura Apps 115 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017
  • 116.
    Thank you! GitHub: https://github.com/kitasuke Demo:SwiftProtobufSample Twitter: @kitasuke Email: yusuke2759@gmail.com 116 — Type-safe Web APIs with Protocol Buffers in Swift, Yusuke Kita (@kitasuke), AltConf 2017