Slide 1

Slide 1 text

͸͡ΊͯͷSwift Server API Shun Takebayashi

Slide 2

Slide 2 text

ΞδΣϯμ • Swift Server APIͱ͸ • HTTP APIͱ͸ • αϯϓϧʹֶͿHTTP API • HTTP APIͷݱঢ় • ·ͱΊ

Slide 3

Slide 3 text

Swift Server APIͱ͸

Slide 4

Slide 4 text

Swift Server APIͱ͸ αʔόʔαΠυͰඞཁͱͳΔίϯϙʔωϯτΛඪ४Խͨ͠APIͷ૯শ

Slide 5

Slide 5 text

Swift Server APIͱ͸ ໨త • ૬ޓӡ༻ੑͷ֬อ • ϚϧνϓϥοτϑΥʔϜ΁ͷରԠ

Slide 6

Slide 6 text

Swift Server APIͱ͸ Χόʔ͢ΔྖҬ • ωοτϫʔΫ • ηΩϡϦςΟ • HTTP

Slide 7

Slide 7 text

Swift Server APIͱ͸ Χόʔ͢ΔྖҬ • ωοτϫʔΫ • ηΩϡϦςΟ • HTTP

Slide 8

Slide 8 text

HTTP APIͱ͸

Slide 9

Slide 9 text

HTTP APIͱ͸ αʔόʔαΠυͰಈ͘HTTPΞϓϦέʔγϣϯͷͨΊͷجຊతͳίϯϙʔωϯτ • ܕ΍ΠϯλʔϑΣʔε • σϑΥϧτͷ࣮૷ ΢ΣϒΞϓϦέʔγϣϯϑϨʔϜϫʔΫͰ͸ͳ͍

Slide 10

Slide 10 text

HTTP APIͱ͸ ΞϓϦέʔγϣϯ ϦΫΤετ Ϩεϙϯε αʔό ϦΫΤετ Ϩεϙϯε ΫϥΠΞϯτ

Slide 11

Slide 11 text

HTTP APIͱ͸ ΞϓϦέʔγϣϯ ϦΫΤετ Ϩεϙϯε αʔό ϦΫΤετ Ϩεϙϯε ΫϥΠΞϯτ

Slide 12

Slide 12 text

HTTP APIͱ͸ HTTPRequestHandler HTTPRequest HTTPResponseStatus, … HTTPServing ϦΫΤετ Ϩεϙϯε ΫϥΠΞϯτ

Slide 13

Slide 13 text

HTTP APIͱ͸ public typealias HTTPRequestHandler = (HTTPRequest, HTTPResponseWriter) -> HTTPBodyProcessing public protocol HTTPServing : class { func start(port: Int, handler: @escaping HTTPRequestHandler) throws // ... }

Slide 14

Slide 14 text

αϯϓϧʹֶͿHTTP API

Slide 15

Slide 15 text

let app: HTTPRequestHandler = { (request, responseWriter) in let headers: HTTPHeaders = ["Content-Type": "text/plain"] responseWriter.writeHeader(status: .ok, headers: headers) responseWriter.writeBody("Hello, world!") return .discardBody }

Slide 16

Slide 16 text

let app: HTTPRequestHandler = { (request, responseWriter) in let headers: HTTPHeaders = ["Content-Type": "text/plain"] responseWriter.writeHeader(status: .ok, headers: headers) responseWriter.writeBody("Hello, world!") return .discardBody }

Slide 17

Slide 17 text

let app: HTTPRequestHandler = { (request, responseWriter) in let headers: HTTPHeaders = ["Content-Type": "text/plain"] responseWriter.writeHeader(status: .ok, headers: headers) responseWriter.writeBody("Hello, world!") return .discardBody }

Slide 18

Slide 18 text

let app: HTTPRequestHandler = { (request, responseWriter) in let headers: HTTPHeaders = ["Content-Type": "text/plain"] responseWriter.writeHeader(status: .ok, headers: headers) responseWriter.writeBody("Hello, world!") return .discardBody }

Slide 19

Slide 19 text

try! HTTPServer().start(port: 8080, handler: app)

Slide 20

Slide 20 text

let app: HTTPRequestHandler = { (request, responseWriter) in responseWriter.writeHeader(status: .ok) return .processBody { (chunk, stop) in switch chunk { case .chunk(let data, let finishedProcessing): responseWriter.writeBody(data) { _ in finishedProcessing() } case .end: responseWriter.done() default: stop = true responseWriter.abort() } } }

Slide 21

Slide 21 text

let app: HTTPRequestHandler = { (request, responseWriter) in responseWriter.writeHeader(status: .ok) return .processBody { (chunk, stop) in switch chunk { case .chunk(let data, let finishedProcessing): responseWriter.writeBody(data) { _ in finishedProcessing() } case .end: responseWriter.done() default: stop = true responseWriter.abort() } } }

Slide 22

Slide 22 text

let app: HTTPRequestHandler = { (request, responseWriter) in responseWriter.writeHeader(status: .ok) return .processBody { (chunk, stop) in switch chunk { case .chunk(let data, let finishedProcessing): responseWriter.writeBody(data) { _ in finishedProcessing() } case .end: responseWriter.done() default: stop = true responseWriter.abort() } } }

Slide 23

Slide 23 text

let app: HTTPRequestHandler = { (request, responseWriter) in responseWriter.writeHeader(status: .ok) return .processBody { (chunk, stop) in switch chunk { case .chunk(let data, let finishedProcessing): responseWriter.writeBody(data) { _ in finishedProcessing() } case .end: responseWriter.done() default: stop = true responseWriter.abort() } } }

Slide 24

Slide 24 text

let app: HTTPRequestHandler = { (request, responseWriter) in responseWriter.writeHeader(status: .ok) return .processBody { (chunk, stop) in switch chunk { case .chunk(let data, let finishedProcessing): responseWriter.writeBody(data) { _ in finishedProcessing() } case .end: responseWriter.done() default: stop = true responseWriter.abort() } } }

Slide 25

Slide 25 text

let app: HTTPRequestHandler = { (request, responseWriter) in responseWriter.writeHeader(status: .ok) return .processBody { (chunk, stop) in switch chunk { case .chunk(let data, let finishedProcessing): responseWriter.writeBody(data) { _ in finishedProcessing() } case .end: responseWriter.done() default: stop = true responseWriter.abort() } } }

Slide 26

Slide 26 text

let app: HTTPRequestHandler = { (request, responseWriter) in responseWriter.writeHeader(status: .ok) return .processBody { (chunk, stop) in switch chunk { case .chunk(let data, let finishedProcessing): responseWriter.writeBody(data) { _ in finishedProcessing() } case .end: responseWriter.done() default: stop = true responseWriter.abort() } } }

Slide 27

Slide 27 text

try! HTTPServer().start(port: 8080, handler: app)

Slide 28

Slide 28 text

public typealias HTTPBodyHandler = (HTTPBodyChunk, inout Bool) -> Void public enum HTTPBodyProcessing { case discardBody case processBody(handler: HTTPBodyHandler) } public enum HTTPBodyChunk { case chunk(data: DispatchData, finishedProcessing: ()-> Void) case end // ... }

Slide 29

Slide 29 text

αϯϓϧʹֶͿHTTP API جຊతͳྲྀΕ • HTTPRequestHandlerΛ࣮૷͢Δ • HTTPRequestΛड͚औΓɺHTTPResponseWriterʹॻ͖ࠐΉ • ϦΫΤετϘσΟΛॲཧ͢Δ৔߹͸HTTPBodyHandlerΛ࣮૷͢Δ • ෳ਺ճ࣮ߦ͞ΕΔՄೳੑ͕͋Δ (Chunked Transfer)

Slide 30

Slide 30 text

HTTP APIͷݱঢ়

Slide 31

Slide 31 text

HTTP APIͷݱঢ় ਖ਼ࣜϦϦʔεલ ·ͩਖ਼ࣜϦϦʔε͸͞Ε͓ͯΒͣɺ೔ʑվળ͞Ε͍ͯΔ • https://github.com/swift-server/http • [email protected] ഁյతͳมߋ͕ߦΘΕΔՄೳੑ΋͋Δ

Slide 32

Slide 32 text

HTTP APIͷݱঢ় HTTP APIʹґଘͨ͠ΞϓϦέʔγϣϯͷϏϧυํ๏ λά͕ৼΒΕ͍ͯͳ͍ͨΊɺSwift 4ͷPackage Manager͕ඞཁ let package = Package( name: "swift-http-example", dependencies: [ .package(url: "https://github.com/swift-server/http.git", .branch("develop")), ], targets: [ .target(name: "swift-http-example", dependencies: ["SwiftServerHTTP"]), ] )

Slide 33

Slide 33 text

·ͱΊ

Slide 34

Slide 34 text

·ͱΊ • Swift Server API͸ϙʔλϒϧͳαʔόʔαΠυSwiftΛ࣮ݱ͢ΔͨΊͷAPI • HTTP API͸HTTPΞϓϦέʔγϣϯͷͨΊͷڞ௨ΠϯλʔϑΣʔε • ΞϓϦέʔγϣϯ͸HTTPRequestHandlerΛ࣮૷ • αʔόʔ͸HTTPServingΛ࣮૷ • ೚ҙͷαʔόʔͱΞϓϦέʔγϣϯΛ૊Έ߹Θ࣮ͤͯߦՄೳ • ·ͩਖ਼ࣜϦϦʔεલͷ࢓༷Ͱ͋ΓɺML౳Ͱٞ࿦΁ͷࢀՃ͕Մೳ