之前使用Scala Play! Framework作为前端框架开发项目,使用netty作为应用服务器,感觉非常轻便、好用,尤其是scala的语法简单、直观,虽然有些操作还要查看文档才能实现,但仍然不想在回归到Java上面,即使Java8有了lambda,还是感觉语法太笨重。
现在有个新的项目,是轻前端、重服务端的,开始就要考虑服务端接口要提供给移动应用客户端和web前端,再考察了几个框架后,决定采用Spray(spray.io)作为服务器端实现,这样可以给不同的客户端提供接口。Web前端打算使用AngularJS,移动端目前要支持Android。
Spray官方文档中有一个Get Started的Demo,很简单直接的一个例子,有两个版本,一个是基于Jetty的Servlet版,另外一个是基于Spray项目的HTTP Server spray-can的例子,我先从这个例子开始。
从链接下载该项目源码。
由于我习惯使用IDEA作为Scala的IDE, 所以下载一个sbt-idea的sbt插件,用于生成idea项目。可以从此链接下载,下载完成后按照该项目的安装提示将plugin添加到sbt中,运行gen-idea生成idea工程
按照Spray template的guide,安装运行该项目。当然,前提是安装sbt,然后运行sbt,它会自动下载相应的所有dependency。
服务器启动后,直接访问8080端口,即可看到默认页面。
默认例子是使用html作为response,我添加了一段代码让其增加对指定路径响应JSON,在MyService的myRoute变量中加入一段:
val myRoute =
path("") {
get {
respondWithMediaType(`text/html`) { // XML is marshalled to `text/xml` by default, so we simply override here
complete {
<html>
<body>
<h1>Say hello to <i>spray-routing</i> on <i>spray-can</i>!</h1>
</body>
</html>
}
}
}
}~
path("ping"){
get{
respondWithMediaType(`application/json`){
complete{
jsonPrefix + "{result: 'PONG'}"
}
}
}
}
重新编译重启,然后输入http://localhost:8080/ping,浏览器上就可以看到JSON字符串了。在这个简单的过程发现两个问题:
Spray的调试不是hotswap的,必须要手动重启服务器,这点没有playframework方便。
在设置JSON的response类型的时候,出现一个很尴尬的情况,可能是我眼神不好,把那个application/json外面的当成了单引号,然后怎么都不对,一直报编译错误。后来仔细看了一下他原来的代码,原来外面的不是单引号,而是~这个不按shift时候的值,就是键盘左上角的那个键,汗~~
Spray作为一个简单的REST服务端框架,已经经过很多高并发项目的验证,性能和可靠性都没问题。因为它是基于高并发架构akka的,所以这方面肯定是可靠的,后面有心得还会继续在这记录。