4. Scalatra Unfiltered Завершение
Scalatra
Обработка параметров:
Поддержка именованных параметров:
get("/hello/:name")
Wildcards:
get("/say/*/to/*)
multiParams("splat") == Seq("hello", "world")
Regexp:
get("""^/f(.*)/b(.*)""".r)
multiParams("captures") == Seq("oo", "ar")
Павел Залунин
Scala On Rest
5. Scalatra Unfiltered Завершение
Scalatra
Тестирование (обертки для ScalaTest, Specs2, Specs):
"events rest protected api" should {
var user: User = null
doFirst {
val json = compact(render(Map("login" -> "pasha",
"password" -> "54321")))
put("/api/user/new", json) {
status must ==(200)
user = parse(body).extract[User]
}
}
Павел Залунин
Scala On Rest
6. Scalatra Unfiltered Завершение
Challenge (Scalatra)
Пример использования для написание RESTful веб-сервиса с
OAuth аунтефикацией.
scalaz (scalatraz.scala, rest_api.scala)
specs (rest_api.scala, utils.scala)
lift-json
info.whiter4bbit.oauth - behind
mongodb (casbah) - behind
Павел Залунин
Scala On Rest
7. Scalatra Unfiltered Завершение
Unfiltered
Тулкит для обработки HTTP запросов. Предоставляет
несколько бекендов: jetty, netty.
Обработчики запросов - PartialFunction’s
PartialFunction[HttpRequest[A], ResponseFunction[B]]
Использование Pattern Matching для разбора запросов:
case r @ PUT(Path("/public/user/new"))
case GET(Path(Seg("events"::"latest"::int(num)::Nil)))
case GET(Path("/protected/user/info")) & request
Использование комбинаторов для обработки запроса
(library/src/main/scala/response.scala):
Created ~> ResponseString("Record created")
MethodNotAllowed ~> ResponseString("Must be GET")
Павел Залунин
Scala On Rest
8. Scalatra Unfiltered Завершение
Unfiltered
Использование различных бекендов:
Jetty/Servlet container - HttpRequest[HttpServletRequest].
val app: javax.servlet.Filter
= unfiltered.filter.Planify {
...
}
unfiltered.jetty.Http.local(8080).filter(app).run
Netty - HttpRequest[ReceivedMessage].
val hello = unfiltered.netty.cycle.Planify {
...
}
unfiltered.netty.Http(8080).handler(app).run()
Павел Залунин
Scala On Rest
9. Scalatra Unfiltered Завершение
Unfiltered
Для тестирования написаны обертки для Specs и ScalaTest.
Для отправки запросов используется dispatch-dispatch.
def addUser(login: String, password: String,
f: PutResponse) = {
val credentials = Map("login" -> login,
"password" -> password)
h(host / "public" / "user" / "new"
<<< compact(render(credentials)) as_str f)
}
"create user with valid data" in {
addUser("pasha", "123", {
case (code, _, _, _) => code must_==200
})
}
Павел Залунин
Scala On Rest
10. Scalatra Unfiltered Завершение
Challenge (Unfiltered)
Написание RESTful веб-сервиса аналогичного, написанному с
использованием scalatra.
unfiltered (rest_api.scala)
unfiltered-oauth (host.scala, stores.scala)
mongodb (casbah) (stores.scala, protected_api.scala)
specs (rest_api.scala)
Павел Залунин
Scala On Rest
11. Scalatra Unfiltered Завершение
Benchmark: ab2 -c 9000 -n 10 (events/latest/1)
Павел Залунин
Scala On Rest
12. Scalatra Unfiltered Завершение
На что обратить внимание
liftweb (http:// liftweb.net) - фреймворк с большим
количеством модулей (orm, mongodb, json, apmq, facebook
и т.д.).
circumflex (http:// cicrkumflex.ru) - scalatra-sinatra-like
фреймворк.
Павел Залунин
Scala On Rest
13. Scalatra Unfiltered Завершение
Ссылки/Примеры использования
https:// github.com/scalatra/scalatra
https:// github.com/n8han/Unfiltered
https:// github.com/n8han/All-Aboard
https:// github.com/softprops/unfiltered-websockets.g8
https:// github.com/softprops/unfiltered-oauth-client.g8
https:// github.com/softprops/unfiltered-oauth-server.g8
Павел Залунин
Scala On Rest
14. Scalatra Unfiltered Завершение
Все...
Павел Залунин
Scala On Rest