読者です 読者をやめる 読者になる 読者になる

ScalaのHTTPライブラリSpray-canをさわってみる

Scala Spray

Spray

spray | REST/HTTP for your Akka/Scala Actors
Sprayは軽量で高速なHTTPサーバを提供するライブラリたち。
Akkaベースで、完全な非同期であり、数千の同時接続を処理することができる。
RESTfulなスタイルや様々なアプリケーション層の明確な分離を促進する。

今回はその中のSpray-canを使う。


Spray-can

http://spray.io/documentation/1.2.3/spray-can/
Spray-canは、低オーバヘッドで、高パフォーマンスなHTTPサーバを提供する。

準備

tabakazu.hatenablog.com

この記事で作成した雛形から始めます。



Installation

// build.sbt

name := "spraycan_sample"

version := "1.0"

scalaVersion := "2.11.8"

libraryDependencies ++= Seq(
    "com.typesafe.akka" %% "akka-actor" % "2.4.10",
    "io.spray" %% "spray-can" % "1.3.3"
)



HTTP Server

HTTPサーバのアクターを作成するWebServer.scala
インスタンスを作成してアクターポイントに追加するMain.scalaを作成。

// src/main/scala/Main.scala

import akka.actor.{Props, ActorSystem}
import akka.io.IO
import spray.can.Http

object Main {
  def main(args: Array[String]): Unit = {
    implicit val system = ActorSystem()

    val myWebServer = system.actorOf(Props[WebServer])

    IO(Http) ! Http.Bind(myWebServer, interface = "localhost", port = 8080)
  }
}

IO APIは、すべての操作が、メッセージが呼び出しの代わりに渡すことで実装されていることを意味する。

// src/main/scala/WebServer.scala

import akka.actor.Actor
import spray.can.Http
import spray.http.{HttpRequest, HttpResponse, HttpMethods, Uri}

class WebServer extends Actor {
  def receive = {
    case _: Http.Connected => sender ! Http.Register(self)

    case HttpRequest(HttpMethods.GET, Uri.Path("/"), _, _, _) =>
      sender ! HttpResponse(entity = "Hello Spray-can")

    case _: HttpRequest =>
      sender ! HttpResponse(status = 404, entity = "Unknown page!")
  }
}

Routingは、rootのGETで「Hello」を返し、 それ以外は404で、「Unknown page!」を返す。



実行

sbt compile run

http://localhost:8080/ で確認。
Hello Spray-canが表示されれば成功。

以上です。
Akka-HTTPをさわる前に、軽くだけSpray-canをさわってみました。
次はSpray-routingでREST APIなんか作りたいです。無理そう...汗