1. takebayashi

    Posted

    takebayashi
Changes in title
+SwiftでSinatraっぽくWebアプリケーションを書いてLinuxで動かす
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,71 @@
+
+AppleがWWDCでの公約通りSwiftをオープンソース化し、Linuxプラットフォームをサポートするようになりました。これまでSwiftの主戦場は大半がiOSアプリ、一部がOSXアプリでしたが、せっかくなのでここではOSXでもLinuxでも動く簡単なWebアプリケーションを作成してみました。
+
+## Swiftra
+
+Rubyには[Sinatra](http://www.sinatrarb.com)という簡潔な言語内DSLでWebアプリケーションを作成できるフレームワークがありますが、似たようなものをSwiftで実現するライブラリ[Swiftra](https://github.com/takebayashi/swiftra)を作成してみました。
+
+Swiftraを利用すると、下記のようなDSLで記述することができるようになります。
+
+```swift
+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行追加するだけで設定は完了します。
+
+```swift
+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`が正常に動作しないという問題があるため、アプリケーションコードのどこかに下記のような記述を追加する必要があります。
+
+```swift
+#if os(Linux)
+ import Glibc
+#endif
+```
+
+あとは、`main.swift`を作成し、前節に示したようなコードを記述することでWebアプリケーションを作成できます。
+
+# Swiftraアプリケーションを実行する
+
+[Swiftraを利用した簡単なサンプル](https://github.com/takebayashi/swiftra-example)を用意したので、これを実行してみます。オープンソース版のSwiftがインストールされた環境で、下記を実行します。
+
+```bash
+$ 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](https://github.com/takebayashi/swiftra)というオリジナルのライブラリを利用してWebアプリケーションを作成する例を示しました。OSXをターゲットにしたSwiftのWebアプリケーションフレームワークはこれまでにもいくつかありましたが、Linux版の登場によってこの分野がさらに活発になるのではないでしょうか。
+
+なお、ここで紹介したSwiftraは現時点では静的ルーティングしかサポートしておらず、機能的にもかなり貧弱です。また、Swiftraでは主にWebアプリケーションのためのDSLを提供するためのライブラリですが、その背後でHTTPサーバとして動作するためのSwiftによる実装としてちょうどよいものがなかったたため、最低限のHTTP/1.0サーバを[http4swift](https://github.com/takebayashi/http4swift.git)として実装しました。Swiftのオープンソース化によってこの分野が活性化され、より安定した実装が登場することが期待されます。