scala spray 概念性内容的总结

spray 是基于 akka 的轻量级 scala 库,可用于编写 REST API 服务。了解 spray 的 DSL 后可以在很短的时间内写出一个 REST API 服务,它的部署并不需要 tomcat , apche 等容器,可以直接 run。对于每一个 route, spray 都会 sprawn 一个或多个 actor提供服务,actor 的数目是可以配置的,我们不需要关心多线程处理的问题。从 benchmark 来看, spray 的性能是很不错。另外,spray 提供了一套测试套件,testkit,使用它可以在本地测试 API 的可用性,测试功能非常强大,我想它可以完全取代 SoapUI 之类的自动化测试工具。

但是,学习使用spray的过程还是比较痛苦的,举个例子

Await.result(statement, 5.seconds)

写下这行代码后,IDE 会抱怨 5.seconds 理解不了,但是它在哪,IDE并不会提示。还有很多情况是,IDE 不会抱怨,但是编译过程会出错,说找不到某个 implicit 变量。接触spray三个月,最让我头疼的就是implicit变量的问题。关于常用的变量的头文件位置,我想专门写一篇日志记录一下。

下面是一些概念性的理解,主要是参考 spray doc,附带部分自己的理解。

Route

type Route = RequestContext => Unit

RequestContext 在 route 里是局部变量,它总是存在的,我们可以在 route 的任何位置调用 RequestContext 的方法。RequestContext 包含     request 和 response 两层含义,既能获得request传过来的数据,也能完成.complete, .reject 等response语义。Route的定义并没有返回值,它的返回值为Unit,这是因为Route 采用的是 fire and forget (tell) 模式,它的好处首先是灵活,没有限制返回值的类型,其次是这种设计是完全的非阻塞的,易于和actor结合。

Directive (指令)

spray的 DSL 就是一个个 Directive 拼在一起的

def routes = {  path("") {    get {      respondWithMediaType(`text/html`) {        complete {          DefaultValues.defaultAPI        }      }    }  }}

path, get, respondWithMediaType, complete 都算是一条 Directive。他们嵌套在一起形成一个 Route 的语义。一般来讲,Directive有四个功能,首先是复制 RequestContext 到下一层 Directive,RequestContext 在传输的过程中是 immutable 的。其次,它可以获取 requester 附带的参数,比如 parameters, formData, jsonData 等,还能完成 marshall, unmarshall 操作。定义路径和某些逻辑来过滤一条请求,比如不符合任意一个 path 的请求将会被 reject,逻辑可以是 header 必须拒绝缓存,post data 只允许 json 格式等等。最后,他可以用返回结果到 requester,可以定义结果的类型和值,在上面的例子上就是 text/html 和 string(defaultAPI)

Reject, Exception, Timeout handling

requester的请求可能格式有错误,可能权限不足,也可能数据包丢失,因此 spray 需要 ”异常“处理。异常处理可以是显式的自定义声明,spray 也有默认的实现。对于那些不符合任何 path(或者符合 reject path), 传输数据出错,没有认证的请求,spray 会调用 reject handling 的实现,程序的执行过程中出现的问题会调用 exception handling定义的操作,比如对于除0异常的处理。 Timeout 最简单,它定义请求在多少时间没有应答就会返回超时错误。

spray 通过 complete(code, message) 实现,浏览器会显示 code, message。对那些比较普遍的错误,spray有自定义的code, message,而那些自定义的错误,我们要手写 code message。

Json support

时间: 2024-10-10 12:47:47

scala spray 概念性内容的总结的相关文章

Scala读取文件内容

import scala.io.Source if(args.length>0){ for(line <- Source.fromFile(args(0)).getLines) println(line.length+" "+line) } else Console.err.println("Please enter filename");

scala学习(二)

接着上次的学习,今天学习scala的下面内容咯~~ 1·使用集(set)和映射(map) 学习过java的童鞋们,看见这两个肯定很开心咯,因为很眼熟哦. scala的集合,分为可变类型和不可变类型.array--可变:list保持不变 那么set和map呢,他们通过类继承的差别控制可变和不可变~~ 先看个set的列子吧: var jetSet = Set("zhangsan","lisi") jetSet += "wangwu" println(

为什么选择Scala,它在大数据处理方面有何优势?

近年来,关于大数据讨论已然是热火朝天,虽不说是家喻户晓,那至少对于业界来说也是引起了轩然大波.作为学生党的我,最近也在研究关于大数据的东东.作为一个技术迷,总是会想尝试一些新鲜的东西.前一段时间学习了Hadoop之后,又想看看Spark是什么东东.那么在这里有必要八卦一下Spark了. Spark是发源于美国加州大学伯克利分校AMPLab的集群计算平台.它立足于内存计算,从多迭代批量处理出发,兼收并蓄数据仓库.流处理和图计算等多种计算范式,是罕见的全能选手.就大数据集而言,对典型的迭代机器 学习

Scala极速入门

摘要 当面向对象遇到函数式编程,这就是Scala.简练的语言描述与简单的例子相辅相成,希望能够对大家学习Scala有所帮助. scala 入门 定义 Scala语言是一种面向对象语言,同时又结合了命令式(imperative)和函数式(functional)编程风格.官网描述:Object-Oriented Meets Functional(面向对象遇到函数式编程). 安装 下载地址http://www.scala-lang.org/download/ 当前版本2.11.4 设置环境变量 exp

使用SBT构建Scala应用【转载】

使用SBT构建Scala应用 SBT简介 SBT是Simple Build Tool的简称,如果读者使用过Maven,那么可以简单将SBT看做是Scala世界的Maven,虽然二者各有优劣,但完成的工作基本是类似的. 虽然Maven同样可以管理Scala项目的依赖并进行构建, 但SBT的某些特性却让人如此着迷,比如: 使用Scala作为DSL来定义build文件(one language rules them all); 通过触发执行(trigger execution)特性支持持续的编译与测试

Java 8 vs. Scala(一): Lambda表达式

[编者按]虽然 Java 深得大量开发者喜爱,但是对比其他现代编程语言,其语法确实略显冗长.但是通过 Java8,直接利用 lambda 表达式就能编写出既可读又简洁的代码.作者 Hussachai Puripunpinyo 的软件工程师,作者通过对比 Java 8和 Scala,对性能和表达方面的差异进行了分析,并且深入讨论关于 Stream API 的区别,本文由OneAPM 工程师编译整理. 数年等待,Java 8 终于添加了高阶函数这个特性.本人很喜欢 Java,但不得不承认,相比其他现

Scala的数据类型和基础语法

 lang 2.1.     和Java的异同 2.1.1.  语法 Java++:增加的语法 Java--:删减的语法 纯OO 静态成员 操作符重载 原生数据类型 closure break.continue 使用trait进行mixin组合 接口 existential type(_) 通配符List<?>, import pkg.*; 抽象类型 (type T) class C1[T] {...} 原始类型 class C1<T> {...} 模式匹配 enum枚举 注:

Scala的下载安装

Scala官网 地址:http://www.scala-lang.org/download/ 三选一 Download Scala 2.11.4 binaries for your system 直接安装Scala Get started with Typesafe Activator Typesafe Activator is a browser-based or command-line tool that helps developers get started with Scala. 不

第一个GraphX程序

程序功能:收集顶点指向的邻居中所在地 /* * 找出每个顶点所指向的邻居中所在的地区 */ import org.apache.spark.SparkContext import org.apache.spark.SparkContext._ import org.apache.spark.SparkConf import scala.collection.mutable.Map import org.apache.spark._ import org.apache.spark.graphx._