IBM Cloud Tools for Swiftの使い方
「Project」画面には現在デプロイしているランタイムの概要が表示されます。
プロジェクト名の下のURLは、現在デプロイされているURLが表示されます。クリックするとブラウザが起動して、そのURLの確認することができます。
その下にはローカルに保存されているプロジェクトフォルダのパスが表示されます。これをクリックするとフォルダを開けます。
その左下にはランタイムの状態が表示されています。現在正常にデプロイされているので緑色で「Running」と表示されています。
その右のアイコン群でランタイムの操作ができます。
キャプチャの番号 | 名前 | 説明 |
---|---|---|
① | View on Bluemix | Bluemixのコンソール画面をブラウザで開く |
② | Deploy | ランタイムへソースをデプロイする |
③ | Stop | ランタイムを停止する |
④ | Restart | ランタイムを再起動する |
⑤ | Open URL | ランタイムのURLを開く |
Kituraの使い方
プロジェクトが作成できたので、ここで簡単にKituraというフレームワークの使い方を見ていきたいと思います。
プロジェクトのディレクトリ構成
プロジェクトが作成された直後は、以下のようなフォルダ構成になっています。
└── first-kitura-project ├── Kitura-Build ├── LICENSE.txt ├── Makefile ├── Package.swift ├── Procfile ├── README.md ├── Sources │ └── main.swift ├── docker-compose.yml ├── manifest.yml └── public └── index.html
ビルドをしてみる
KituraプロジェクトはMakefileが整備されているので、コマンド一つでKituraサーバーをビルドすることができます。
まず、Kituraサーバーがどういうものなのかを把握するために、ビルドしてみましょう。
「first-kitura-project」直下に移動して、ビルドコマンドを実行します。
$ cd first-kitura-project $ make run
以下のようにコンソールにログがでてきたら成功です。
. . . --- Invoking KituraSample executable ./.build/debug/Kitura-Starter-Bluemix INFO: Kitura_Starter_Bluemix main.swift line 60 - Server will be started on 'http://localhost:8090'. VERBOSE: run() Kitura.swift line 44 - Staring Kitura framework... VERBOSE: run() Kitura.swift line 46 - Starting an HTTP Server on port 8090... INFO: listen(socket:port:) HTTPServer.swift line 132 - Listening on port 8090
これでサーバーが立ち上がった状態になりました。以下のURLにブラウザでアクセスしてみましょう。
下記のようにKituraのページが表示されていれば成功です。
Kitraでは、デフォルトでルートパスに、このページが表示されるようになっています。
次に、以下のURLにアクセスしてみましょう。
下記のような文字が表示されたかと思います。
Hello from Kitura-Starter-Bluemix!
このURLはKituraのルーティングで表示している文字列になります。
main.swiftファイルをみてみる
main.swiftがSwiftのメインファイルです。ビルド後、アプリは最初にこのファイルを実行します。
ファイルを開いてみると、以下のようになっているかと思います。
import Foundation import Kitura import KituraSys import KituraNet import LoggerAPI import HeliumLogger import CloudFoundryEnv // Disable all buffering of stdout setbuf(stdout, nil) // All web apps need a Router instance to define routes let router = Router() // Using the HeliumLogger implementation for Logger Log.logger = HeliumLogger() // Serve static content from "public" router.all("/static", middleware: StaticFileServer()) // Basic GET request router.get("/hello") { _, response, next in Log.debug("GET - /hello route handler...") response.headers["Content-Type"] = "text/plain; charset=utf-8" try response.status(.OK).send("Hello from Kitura-Starter-Bluemix!").end() } // Basic POST request router.post("/hello") { request, response, next in Log.debug("POST - /hello route handler...") response.headers["Content-Type"] = "text/plain; charset=utf-8" if let name = try request.readString() { try response.status(.OK).send("Hello \(name), from Kitura-Starter-Bluemix!").end() } else { try response.status(.OK).send("Kitura-Starter-Bluemix received a POST request!").end() } } // Start Kitura-Starter-Bluemix server do { let appEnv = try CloudFoundryEnv.getAppEnv() let port: Int = appEnv.port Log.info("Server will be started on '\(appEnv.url)'.") Kitura.addHTTPServer(onPort: port, with: router) Kitura.run() } catch CloudFoundryEnvError.InvalidValue { Log.error("Oops... something went wrong. Server did not start!") }
Kituraは、Node.jsのExpressのようなルーティング指定でサーバーへのアクセスを制御するのが特徴です。
まず、基本的なKituraの使い方を見てみたいと思います。Kituraの使い方を簡単に2点に絞って説明します。
- ルーティング指定
- Kituraサーバーの作成
ルーティング指定
アプリケーション・エンドポイントと、それのリクエストがあった場合の処理を行うためにはRouterクラスのインスタンスを作成する必要があります。
let router = Router()
Routerクラスには各HTTPメソッドに対応するメソッドが用意されています。代表的なメソッドを列挙してみます。
HTTPメソッド | Routerインスタンスメソッド |
---|---|
GET | get(_:handler:), get(_:middleware:) |
POST | post(_:handler:), post(_:middleware:) |
PUT | put(_:handler:), put(_:middleware:) |
DELETE | delete(_:handler:), delete(_:middleware:) |
例えば、get(_:handler:)メソッドなら、第1引数にエンドポイントのパス、第2引数にレスポンス処理をクロージャーで指定することができます。
router.get("/hello") { _, response, next in Log.debug("GET - /hello route handler...") response.headers["Content-Type"] = "text/plain; charset=utf-8" try response.status(.OK).send("Hello from Kitura-Starter-Bluemix!").end() }
上記はエンドポイント"/hello"にGETリクエストがあった場合の処理です。
レスポンスの処理を抜き出してみます。
response.headers["Content-Type"] = "text/plain; charset=utf-8" try response.status(.OK).send("Hello from Kitura-Starter-Bluemix!").end()
レスポンスヘッダー「Content-Type」に「text/plain; charset=utf-8」をセットしています。RouterResponseクラスのインスタンスresponseのstatus(_:)メソッドを実行します。「.OK」はステータスコード200の意味です。さらにsend(_:)メソッドでクライアントに文字列を送信し、end(_:)メソッドでレスポンス処理を終了させています。
Kituraサーバーの作成
do { let appEnv = try CloudFoundryEnv.getAppEnv() let port: Int = appEnv.port Log.info("Server will be started on '\(appEnv.url)'.") Kitura.addHTTPServer(onPort: port, with: router) Kitura.run() } catch CloudFoundryEnvError.InvalidValue { Log.error("Oops... something went wrong. Server did not start!") }
最後にこの部分でKituraサーバーを起動しています。
CloudFoundryEnv.getAppEnv()でアプリの情報を取得し、ポート情報を取得します。デフォルトでは8090になります。
Kitura.addHTTPServer(onPort: port, with: router) Kitura.run()
で、Kituraサーバーを起動させています。
KituraとObject Strageを使ってデータを保存する
さてKituraの基本をご紹介したところで、いよいよKituraでWeb APIを作っていきたいと思います。今回はBluemixのObject Strageを使って、Kituraからデータを送り、ファイルに保存します。
Object Strageはファイルデータを保存できるサービスです。そしてREST APIで認証やファイルの追加や書き換えができます。
今「旬」のテクノロジーや革新的なサービスを一挙紹介!
オープンイノベーションを支える国内外の最新事例を始め、最先端の技術を活用しサービスを展開している企業やコミュニティの皆さまより、全32セッション(クラウド・ロボティックス・IoT・DevOps・ビックデーターなど)が予定されています。
インフラエンジニアも、開発エンジニアも、営業の方も、そうでない方も、クラウドを活用した、最新のサービスやテクノロジーに興味のある方ならどなたでも参加していただけます。イベント開催の二日間、今「旬」のテクノロジーやビジネスをお楽しみください。