VaporでJSONをresponseとして返すサンプルを書いてみた

2017.01.25

はじめに

こんぬづは、try! SwiftのLTのCfPを二本、どちらも英語と日本語で送ったけど採用されるか気になって夜も眠れない田中です。

今回はサーバーサイドSwiftのWebフレームワークであるVaporでJSONをresponseとして返すサンプルの紹介です。

扱う内容は以下になります。

  • VaporでJSONを返すサンプルの紹介
  • おまけ: Nodeとは?

検証環境

  • Swift 3.0.2
  • Vapor 1.3

VaporでJSONを返すサンプルの紹介

プロジェクトはGitHubにあげておきましたので、気になる方はこちらも御覧ください。

内容はとてもシンプル。Vapor Toolboxを使ってテンプレートからプロジェクトを生成すると、JSON生成用のライブラリも一緒にインストールされます。JSONを扱う箇所ではそのライブラリをimportして下記のサンプルコードのようにJSONを生成します。

import Vapor
import JSON

let drop = Droplet()

drop.get("json") { request in
    let json = try JSON(node: [
        "name": "Tanaka Kenji",
        "nickName": "ダンボー田中",
        "age": 23
        ]
    )
    
    return json
}

drop.run()

おまけ: Nodeとは?

JSONの生成箇所のinitの引数にnodeというものがあります。

let json = try JSON(node: [
    "name": "Tanaka Kenji",
    "nickName": "ダンボー田中",
    "age": 23
    ]
)

Nodeとはなにか?少しだけJSON.swiftの中身を見てみましょう。

// JSON.swift

import Foundation
import Core
@_exported import Node

public struct JSON: NodeBacked {
    public var node: Node
    
    public init(_ node: Node) {
        self.node = node
    }
}

なるほど、JSONはNodeを返すNodeBackedというprotocolに準拠していて、中身は変数とinitializerを持っているのみっぽいですね。詳しくはextensionによるデフォルト実装などがいろいろありますが、今回は省略。

そして本題のNodeの中身。

public enum Node {
    case null
    case bool(Bool)
    case number(Number)
    case string(String)
    case array([Node])
    case object([String: Node])
    case bytes([UInt8])
}

Nodeというのは、プリミティブな型をenumで表した型だったんですね。おそらく内部的にはこれから値を取り出して整形して〜としているはず。なるほど、こういう(書き方)のもあるのか。

まとめ

VaporでJSONをresponseとして返却するサンプルとその中身の紹介をしました。

さあこれでJSONを返すWebAPIが書けるようになった!iOSアプリ連携でごにょごにょできるようになったぞい!

参考・関連