【问题标题】:How do you parse a JSON request with Dispatch?如何使用 Dispatch 解析 JSON 请求?
【发布时间】:2011-06-02 21:43:20
【问题描述】:

我正在学习 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 中进行了描述,我的假设是我只需要导入该特征(_ 应该涵盖的)即可注册。

【问题讨论】:

    标签: scala scala-dispatch


    【解决方案1】:

    您应该从 dispatch.liftjson.Js._ 导入。

    拥有一个特质并没有什么帮助,因为那时你还没有使用它。 JS._ 导入会将 JS 对象的所有内容带入您的作用域,包括来自 trait ImplicitJsonVerbsimplicit conversion requestToJsonVerbs。此方法将标准 Dispatch 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]
    })))
    

    如您所见,我有正确的导入(加上一些我喜欢的 Lift 库),我的 Request 然后“有”># 方法。我给 ># 一个与预期签名 ((JValue) ⇒ T) 匹配的函数,然后我们就走了。

    如果您想知道,我专门使用lift-json 提取到案例类的能力,这意味着T 将是Device。但是,如果lift-json 无法将JValue 转换为Device,它也会引发异常,所以我用Helper.tryo 包装了我的整个请求,这是一个包装try-catch 调用的Lift 辅助方法,返回一个BoxBox 类似于标准的 Scala Option,但添加了 Failure,这表明为什么 Box 为空。因此,在这种情况下,我将获得Full[Device]Failure。好用!

    【讨论】:

      猜你喜欢
      • 2019-05-03
      • 2014-06-27
      • 1970-01-01
      • 2014-07-07
      • 1970-01-01
      • 2022-08-18
      • 1970-01-01
      • 2019-10-03
      • 2020-05-31
      相关资源
      最近更新 更多