iOS
JSON
Swift
Kitura
iRidgeDay 19

猿でもできるKituraでJSONを生成する方法

More than 1 year has passed since last update.

開発環境Xcode8.1

Swift version 3.0.1 (swiftlang-800.0.58.6 clang-800.0.42.1)


はじめに

こんにちは。iRidge Advent Calendar19日目担当します。

Kituraについてです。タイトルの猿でもできるの意味についてはこちら


Kituraとは

A high performance and simple to use web framework for building modern Swift applications.

IBM社がOSSで公開しているSwiftのモダンWebアプリケーションフレームワークです。

Kitura公式


目的

Kituraでレスポンスデータをjsonで返すまでを構築してアプリ開発をしたい。


導入

導入手順はKitura公式に記述してあるGetting Startedを参考


開発するフォルダを作成し以下コマンドを叩く

$ cd myKituraProject

$ swift package init --type executable

コマンドを叩くと以下のような形式で作成されます

myKituraProject

├── Package.swift
├── Sources
│ └── main.swift
└── Tests

Swift Package Managerについてはこちら


Pakage.swiftを編集

import PackageDescription

let package = Package(
name: "myFirstProject",
dependencies: [
.Package(url: "https://github.com/IBM-Swift/Kitura.git", majorVersion: 1, minor: 4)
])


Sources/main.swiftを編集

import Kitura

// Create a new router
let router = Router()

// Handle HTTP GET requests to /
router.get("/") {
request, response, next in
response.send("Hello, Kitura!")
next()
}

// Add an HTTP server and connect it to the router
Kitura.addHTTPServer(onPort: 8090, with: router)

// Start the Kitura runloop (this call never returns)
Kitura.run()


以下コマンドを実行しコンパイルする

$ swift build


以下コマンドを実行しWebアプリケーションを実行する

$ .build/debug/myKituraProject


Open your browser

ブラウザで以下urlを開くと Hello, Kitura!と表示されます :champagne:

http://localhost:8090/

スクリーンショット 2016-12-21 8.50.53.png


ログを表示する


Package.swiftにHeliumLoggerを追加

import PackageDescription

let package = Package(
name: "myFirstProject",
dependencies: [
.Package(url: "https://github.com/IBM-Swift/Kitura.git", majorVersion: 1, minor: 4),
.Package(url: "https://github.com/IBM-Swift/HeliumLogger.git", majorVersion: 1, minor: 4)
])


Sources/main.swiftにHeliumLoggerを初期化

import Kitura

import HeliumLogger

// Initialize HeliumLogger(これこれ追加)
HeliumLogger.use()

// Create a new router
let router = Router()

// Handle HTTP GET requests to /
router.get("/") {
request, response, next in
response.send("Hello, Kitura!")
next()
}

// Add an HTTP server and connect it to the router
Kitura.addHTTPServer(onPort: 8090, with: router)

// Start the Kitura runloop (this call never returns)
Kitura.run()


同様にコンパイルから実行

$ swift build

$ .build/debug/myKituraProject

実行すると無事にログが出力されているのがわかります :champagne:

[2016-12-21T01:00:46.632+09:00] [VERBOSE] [Router.swift:67 init(mergeParameters:)] Router initialized

[2016-12-21T01:00:46.657+09:00] [VERBOSE] [Kitura.swift:71 run()] Starting Kitura framework...
[2016-12-21T01:00:46.658+09:00] [VERBOSE] [Kitura.swift:81 start()] Starting an HTTP Server on port 8090...
[2016-12-21T01:00:46.659+09:00] [INFO] [HTTPServer.swift:85 listen(on:)] Listening on port 8090


XcodeProject


Package.swiftのディレクトリに移動しコマンドを実行

以下コマンドを実行

$ swift package generate-xcodeproj

MyKitura.xcodeprojが生成されます

myKituraProject

|-- MyKitura.xcodeproj
├── Package.swift
├── Sources
│ └── main.swift
└── Tests


Schemeを選択して実行

カバンアイコンの下を選択して実行します

スクリーンショット 2016-12-21 1.20.20.png

実行するとXcodeデバッグエリアにログが表示されます(HeliumLogger実装前提)

スクリーンショット 2016-12-21 1.21.58.png


Open your browser

ブラウザで以下urlを開くと Hello, Kitura!と表示されます :champagne:

http://localhost:8090/


カスタムパスを作成


Sources/main.swiftを編集


router.get("/test") { request, response, next in
try response.send("Hello! Test.").end()
}

main.swiftを編集し、コンパイル->実行してからブラウザでhttp:localhost:9080/testで確認すると Hello! Test. が表示されています :champagne:

スクリーンショット 2016-12-21 8.51.13.png


JSONを作成


SwiftyJSONをインポートする

Sources/main.swiftにおいて SwiftyJSON をインポートします

スクリーンショット 2016-12-21 8.57.58.png


JSON化したいデータをDictionaryで作成

let dict: [String: Any] = [

"shop": "book_store",
"Item": [
"id": "5",
"name": "iOS Tutorial",
"value": "890"
]
]


カスタムパスを作成

router.get("/json") { request, response, next in

response.headers["Content-Type"] = "application/json; charset=UTF-8"
try response.send(json: JSON(dict)).end()
}

SwiftyJSONの使用方法などはこちら


ブラウザで表示

http:localhost:9080/jsonを叩いて確認するとjsonが表示されました :champagne:

スクリーンショット 2016-12-21 9.02.52.png


動的にJSONを生成


クエリストリングで付与したパラメータをjsonに反映させる

router.get("/json") { request, response, _ in

let id = request.queryParameters["id"] ?? ""
let dict: [String: Any] = [
"shop": "bood_store",
"Item": [
"id": "\(id)",
"name": "book",
"value": "890"
]
]
try response.send(json: JSON(dict)).end()
}


ブラウザで表示

クエリストリングを付与させてurlを叩くと動的にjsonが生成されて表示されてます :champagne:

http:localhost:9080/json?id=123455

スクリーンショット 2016-12-21 10.09.21.png


所感


  • 静的なjsonファイルをサーバにデプロイするだけであれば FireBase などmBaaSを使ったほうが手軽感はあると思った


  • クエリストリングなど動的にJsonのvalueを変更して開発を行いたい時にはKituraは良い感じだと思った


  • サーバサイドをSwiftでロジックを書いてCGIを作成する事もできるのは良い感じだと思った



最後に

iRidgeではエンジニアを募集しています。

興味のある方はこちら