Kitura で Codable ルーティング | try! Swift Tokyo 2018 Day2-4

Swift 4では、Codable が導入されました。これは、JSONEncoder や JSONDecoder を通して、JSON を扱いやすくしてくれるものです。 JSONエンコードやデコードが、RESTful API を扱う際の一番複雑な部分です。Codable を使うことで、 Kitura 2.0 は JSON の処理の責務を受け持ち、型安全な方法で、独自の Codable 型で直接処理できます。KituraKit を用いることで、iOS アプリとサーバーサイドの間で型の定義を共有することができるでしょう。

Kitura で Codable ルーティング

IBMで10年

f:id:niwatako:20180302113453j:plain

インドから来ました

f:id:niwatako:20180302113459j:plain

日本の本読んでいます

f:id:niwatako:20180302113513j:plain

このようなJSON文字列からスタートしたいと思います

f:id:niwatako:20180302113526j:plain

JSONの一つの課題は、これを言語の方にコンバートすることです。 そしてまたJSONに戻すということです。

javascript以外では難しいです。

Javascriptはどうするか

f:id:niwatako:20180302113614j:plain

f:id:niwatako:20180302113617j:plain

JavascriptJSONに近いわけです。デコードエンコードができるわけです。 これを別の言語のベンチマークにすることもできるわけです。

JSONとSwiftについて話していきましょう

f:id:niwatako:20180302113719j:plain

f:id:niwatako:20180302113738j:plain

いままではJSONSerializationクラスを使っていました。String文字列のConstantを使っている、そしてそれが、気づかないと問題が起きてしまう、おおきなJSON文字列になってしまう。

IBMでもいろいろやっている

f:id:niwatako:20180302113831j:plain

しかしまだまだ改善が必要

Swift4

f:id:niwatako:20180302113844j:plain

かなり改善されました。

f:id:niwatako:20180302113905j:plain

Encode、DecodeできるEncodableとDecodable

f:id:niwatako:20180302113912j:plain

f:id:niwatako:20180302113938j:plain

Encoder.encodeがすべてやってくれる。

Decodableも同様に簡単

f:id:niwatako:20180302114005j:plain

f:id:niwatako:20180302114022j:plain

f:id:niwatako:20180302114027j:plain

さまざまなケースで利用できます

f:id:niwatako:20180302114118j:plain

これらがすべて型安全でクール

f:id:niwatako:20180302114123j:plain

KituraはOSSのサーバーサイドフレームワークです

f:id:niwatako:20180302114146j:plain

クライアントとサーバーサイドで同じ言語でバグがへり開発しやすくなり、Swiftはメモリフットプリントが少ないのでサーバーにも優しい

明日ワークショップします

f:id:niwatako:20180302114241j:plain

REST APIJSONを使います

f:id:niwatako:20180302114302j:plain

Kituraは様々なクラウドで使えます

f:id:niwatako:20180302114320j:plain

GitAPIを想定します。

f:id:niwatako:20180302114337j:plain

コミットを取得したり、Author指定で取得できたりするとします

ここでシンプルな構造体を使います

f:id:niwatako:20180302114402j:plain

f:id:niwatako:20180302114417j:plain

prepareJSONステップが必要です。 エンコードステップ

f:id:niwatako:20180302114453j:plain

POSTはデコード作業になる

f:id:niwatako:20180302114500j:plain

f:id:niwatako:20180302114516j:plain

f:id:niwatako:20180302114533j:plain

AuthorName毎

f:id:niwatako:20180302114552j:plain

誰が何をするのか

リクエストを送りKituraがRouterRequestを作ります クエリパラメータをパースしてビジネスロジックを行い、結果をJSONにして、レスポンスに返す

青がKitura,緑が皆さんがやる作業

エンコード、デコードは皆さんの作業ということです

f:id:niwatako:20180302114715j:plain

Swift型がCodableなら

f:id:niwatako:20180302114724j:plain

f:id:niwatako:20180302114739j:plain

ロジックだけで住むということになります。CodableRouting

f:id:niwatako:20180302114802j:plain

f:id:niwatako:20180302114805j:plain

f:id:niwatako:20180302114837j:plain

それ以外にもCodable クエリパラメータを処理できます。

f:id:niwatako:20180302114859j:plain

複数のクエリパラメータがあるかもしれません。すべてstructに入っているようにします。オプショナルならオプショナルで定義すればいいのです。

最近リリースした、DB保存するものです

f:id:niwatako:20180302114941j:plain

かなりの作業が必要なところでしたが、こうなります。

f:id:niwatako:20180302115014j:plain

Swift Kuery ORM

f:id:niwatako:20180302115033j:plain

Modelに準拠していればcommitSaveでできる

f:id:niwatako:20180302115055j:plain

クライアント側の問題をみていきましょう

ViewControllerで変換を行います。

RESTAPIからデコードして型に変換する

同じコーダブルの考え方をクライアント側で適用できるのではないか

そこでKituraKit

f:id:niwatako:20180302115135j:plain

f:id:niwatako:20180302115152j:plain

クライアント側とサーバー側でこのように解決できる。

もしKituraKitを使うならAPIもCodableであるほうが好ましいです。

f:id:niwatako:20180302115245j:plain

f:id:niwatako:20180302115248j:plain

End to Endでみてみましょう

どういうコンポーネントがどこで動いているか

Kitura側ではKituraHandler HandlerからPrepareResponseにSwifttyぺが行きます

こうするとコードをクライアントとサーバー側で共有する機会が生まれます

f:id:niwatako:20180302115329j:plain

Type定義が共有できます。今は課題かもしれませんが必ずできるようになります。

簡単にトライするにはこちらのURLをお試しください

f:id:niwatako:20180302115358j:plain

ご清聴ありがとうございました。

f:id:niwatako:20180302115415j:plain

Slackでいつでも質問していただけるし、kitura.ioに情報があるし、全て見たければgithub.com/ibm-swiftに来ていただけます

[広告]面白かったら、ためになったら

  • はてなブックマークSwift タグをつけてブックマーク!
  • 「インターネットで生活を楽しく豊かにしたい」仲間を募集しています
  • Bitcoin: 3KGqXtR1ZaGVdkvcw8CCNrkDxDhdbZBYHL