我正在学习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);
}
}
不幸的是,它抱怨>#未在dispatch.Request中注册。在dispatch.liftjson中描述了这个特征,并且我的假设是我只需要导入该特征(应该覆盖它)以便注册。
答案 0 :(得分:5)
您应该从dispatch.liftjson.Js._
导入。
有一个特性是没有用的,因为你还没有使用它。 JS._
导入会将JS
对象的所有内容带入您的范围,包括来自requestToJsonVerbs
的{{3}} 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]
})))
正如您所看到的,我有正确的导入(加上我喜欢的某些implicit conversion库的一些导入),而我的Request
然后'有'>#
方法。我给>#
一个与预期签名((JValue) ⇒ T
)匹配的函数,然后我们离开。
如果你想知道,我特意使用lift-json提取到案例类的能力,这意味着T
将是Device
。但是,如果无法将JValue
转换为Device
,lift-json也会抛出异常,所以我用Helper.tryo
包裹了我的整个请求,这是一个包裹的Lift辅助方法一个try-catch调用,返回Box
。 Box
与标准Scala Option
类似,但添加了Failure
,表示Box
为空的原因。因此,在这种情况下,我会获得Full[Device]
或Failure
。方便!