Dav*_*mer 7 scala scala-dispatch
我正在学习Scala,并试图了解特征是如何工作的(特别是在Dispatch库中).
我有这样的事情:
import dispatch._
import dispatch.liftjson._
object Foo
{
def main(cmd: Array[String])
{
val http = new Http;
val req = :/("example.com") / path ># (list ! obj);
val res = http(req);
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,它抱怨>#未在dispatch.Request中注册.在dispatch.liftjson中描述了这个特征,并且我的假设是我应该只需要导入该特征(应该覆盖它)以便注册.
你应该从中导入dispatch.liftjson.Js._.
有特点是没有用的,因为你没有使用它.该JS._进口将带来的所有内容JS物到你的范围,包括隐式转换 requestToJsonVerbs,它具有从trait ImplicitJsonVerbs.该方法可转换标准的调度Request,你从有:/("example.com") / path,一个JsonVerbs,它有方法>#.
以下是我查询API的简要示例:
import dispatch._
import dispatch.liftjson.Js._
import net.liftweb.common.{Box, Failure, Full}
import net.liftweb.util.Helpers
case class Device(device_token: String, alias: Option[String])
val req = devicesReq / device_token as (app_token, secret)
Helpers.tryo(http(req ># (json => {
json.extract[Device]
})))
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,我有正确的导入(加上我喜欢的一些Lift库的一些),然后我的Request'有'一个>#方法.我给出>#了一个匹配预期签名((JValue) ? T)的函数,然后我们去了.
如果你想知道,我特意使用lift-json的功能来提取到案例类,这意味着T将会Device.但是,如果它无法将转换JValue为a Device,则lift-json也会引发异常,所以我用Helper.tryo一个包含try-catch调用的Lift辅助方法包装了我的整个请求,返回一个Box.Box就像标准的Scala,Option但添加了Failure,这表明为什么a Box是空的.所以,在这种情况下,我会得到一个Full[Device]或一个Failure.便利!