通过 Spray 创建简单的 Restful Http Server
好久没写文章,实在太忙。最近我在项目中,搭建了很多小的零散的 Restful 服务,各个服务之间通过rest接口调用,相互协作。
Java出身的码农,动辄就是Tomcat、Spring,RestEasy、Hibernate、JPA、Jackson、HttpClient… 这些巨无霸非常臃肿,其实我的项目就是一个简简单单的Rest服务,请求Json参数 → 调用资源接口 → 返回Json数据,还好有Spray!
使用Scala系的工具,无论是体重上(包的大小)还是身高上(代码的长度),都能极大的减负,同时提升逼格和优雅度。下面介绍一个简单的Restful Http Server的开发示例。
首先安装 SBT(简单理解为scala下的maven),安装方法参考 sbt documentation - setup。
win7环境下,直接下载 0.13.1-zip包 解压到c:\sbt,配置SBT_HOME到path,cmd中敲入sbt检查有无成功,%SBT_HOME%\conf\sbtconfig.txt中可以配置启动参数。
# Set the java args to high |
1、-Dfile.encoding 配置成 ISO-8859-1 而不是 UTF-8,是因为在 cmd 下按键盘的上下键,无法切换历史输入的sbt命令,显示全是乱码,这让我很不爽,只好忍痛ISO啦。
2、-Dsbt.boot.directory 和 -Dsbt.ivy.home 是为将sbt自动下载的jar放到非系统盘,以免统一管理,这个看个人爱好。
下面跑一个官方的例子,从Spray的官方文档 Getting Started 上,找到 spray-template,在branch中下载1.3版的 spray-can sample。
解压,执行sbt命令。在浏览器运行 http://127.0.0.1:8080 看结果。
sbt |
build.sbt 已配置 Revolver.settings,可使用命令:re-start和re-stop,详细参考 sbt-revolver。
瞄一下 src/main/scala/com/example/MyService.scala,可以看到只有简单的。trait MyService extends HttpService {
val myRoute =
path("") {
get {
respondWithMediaType(`text/html`) {
complete {
<html>
<body>
<h1>Say hello to <i>spray-routing</i> on <i>spray-can</i>!</h1>
</body>
</html>
}
}
}
}
}
Boot方法启动一个Actor并绑定到8080端口。object Boot extends App {
// we need an ActorSystem to host our application in
implicit val system = ActorSystem("on-spray-can")
// create and start our service actor
val service = system.actorOf(Props[MyServiceActor], "demo-service")
implicit val timeout = Timeout(5.seconds)
// start a new HTTP server on port 8080 with our service actor as the handler
IO(Http) ? Http.Bind(service, interface = "localhost", port = 8080)
}
在 spray-servlet on jetty 分支下,有部署到servlet容器的工程模板代码。另外在 Spray 项目的源代码下,也有一些 example,找到 spray-can/simple-http-server,也可以试着跑一下,其中的 DemoService.scala 例子内容比较多。
更多玩法参考 wiki example-projects 或 document spray-can。
又要忙项目,推荐两个文章吧,自己写 spray 工程可以参考一下:Building REST Service with Scala、API first REST in Akka and Spray、stockman。