Swift
SwiftDay 6

SwiftでSinatraっぽくWebアプリケーションを書いてLinuxで動かす

More than 3 years have passed since last update.

AppleがWWDCでの公約通りSwiftをオープンソース化し、Linuxプラットフォームをサポートするようになりました。これまでSwiftの主戦場は大半がiOSアプリ、一部がOSXアプリでしたが、せっかくなのでここではOSXでもLinuxでも動く簡単なWebアプリケーションを作成してみました。


Swiftra

RubyにはSinatraという簡潔な言語内DSLでWebアプリケーションを作成できるフレームワークがありますが、似たようなものをSwiftで実現するライブラリSwiftraを作成してみました。

Swiftraを利用すると、下記のようなDSLで記述することができるようになります。

import swiftra

get("/hello") { req in
return "Hello, world!"
}

serve(8080)

上記のコードをビルドして実行し、http://localhost:8080/helloへHTTP GETリクエストを送信すると、Hello, world!という文字列をレスポンスとして受け取ることができます。


Swiftraを利用してWebアプリケーションを作成する

Swiftraを利用するには、Swift Package Managerを利用します。下記のように依存定義を1行追加するだけで設定は完了します。

import PackageDescription

let package = Package(
name: "swiftra-example",
dependencies: [
.Package(url: "https://github.com/takebayashi/swiftra.git", majorVersion: 0)
]
)

また、SwiftraをLinux上で利用する場合にはglibcに依存しますが、SwiftのLinux向けビルドの現時点での最新版(778f82939c)では依存モジュールがglibcに依存していてもアプリケーション本体にglibcへの依存がない場合にはswift-autolink-extractが正常に動作しないという問題があるため、アプリケーションコードのどこかに下記のような記述を追加する必要があります。

#if os(Linux)

import Glibc
#endif

あとは、main.swiftを作成し、前節に示したようなコードを記述することでWebアプリケーションを作成できます。


Swiftraアプリケーションを実行する

Swiftraを利用した簡単なサンプルを用意したので、これを実行してみます。オープンソース版のSwiftがインストールされた環境で、下記を実行します。

$ git clone https://github.com/takebayashi/swiftra-example.git

$ cd swiftra-example
$ swift build
$ ./.build/debug/swiftra-example

$ curl 'http://localhost:8080/abc'

/abc was requested with GET

$ curl -X POST -d foo=bar 'http://localhost:8080/abc'
/abc was requested with POST, body = foo=bar

HTTPリクエストを送信すると、それに応じた処理が実行されてHTTPレスポンスとして返ってくることが確認できました。


おわりに

ここでは、Swiftraというオリジナルのライブラリを利用してWebアプリケーションを作成する例を示しました。OSXをターゲットにしたSwiftのWebアプリケーションフレームワークはこれまでにもいくつかありましたが、Linux版の登場によってこの分野がさらに活発になるのではないでしょうか。

なお、ここで紹介したSwiftraは現時点では静的ルーティングしかサポートしておらず、機能的にもかなり貧弱です。また、Swiftraでは主にWebアプリケーションのためのDSLを提供するためのライブラリですが、その背後でHTTPサーバとして動作するためのSwiftによる実装としてちょうどよいものがなかったたため、最低限のHTTP/1.0サーバをhttp4swiftとして実装しました。Swiftのオープンソース化によってこの分野が活性化され、より安定した実装が登場することが期待されます。