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

開発環境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ではエンジニアを募集しています。
興味のある方はこちら


『 Swift 』Article List
Category List

Eye Catch Image
Read More

Androidに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

AWSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Bitcoinに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

CentOSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

dockerに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

GitHubに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Goに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Javaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

JavaScriptに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Laravelに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Pythonに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Rubyに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Scalaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Swiftに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Unityに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Vue.jsに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Wordpressに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

機械学習に関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。