Как вы анализируете запрос JSON с Dispatch? - PullRequest
7 голосов
/ 03 июня 2011

Я изучаю 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, и я предположил, что мне просто нужно импортировать эту черту (которая должна охватывать _) для ее регистрации.

1 Ответ

5 голосов
/ 03 июня 2011

Вы должны импортировать из 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]
})))

Как видите, у меня есть правильный импорт (плюс некоторые для некоторых библиотек Lift , которые мне нравятся), и у моего Request тогда 'есть' метод >#. Я даю ># функцию, которая соответствует ожидаемой сигнатуре ((JValue) ⇒ T), и мы уходим.

В случае, если вам интересно, я специально использую способность lift-json для извлечения в классы дел, то есть T будет Device. Тем не менее, lift-json также выдает исключение, если не может преобразовать JValue в Device, поэтому я поместил весь запрос в Helper.tryo, вспомогательный метод Lift, который оборачивает вызов try-catch возвращая Box. Box похож на стандартную Scala Option, но с добавлением Failure, что указывает, почему Box пусто. Итак, в этом случае я получу либо Full[Device], либо Failure. Handy!

...