/ / Ako analyzujete žiadosť JSON pomocou služby Dispatch? - Scala, Scala-expedícia

Ako analyzujete žiadosť JSON s Dispatchom? - scala, scala-dispatch

Učím sa Scalu a snažím sa pochopiť, ako vlastnosti fungujú (konkrétne s knižnicou Dispatch).

Mám niečo takéto:

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);
}
}

Bohužiaľ, sťažuje sa, že> # nie jezaregistrované s expedíciou. Táto črta je popísaná v dispatch.liftjson a predpokladal som, že na registráciu by som mal potrebovať iba importovať túto črtu (ktorá by mala obsahovať).

odpovede:

5 pre odpoveď č. 1

Mali by ste importovať dispatch.liftjson.Js._.

Mať črtu nie je užitočné, pretože ju nepoužívate. JS._ import prinesie všetok obsah JS objekt do svojho rozsahu, vrátane implicitná konverzia requestToJsonVerbs z ktorého pochádza trait ImplicitJsonVerbs, Táto metóda prevádza štandardný dispečing Request, z ktorého pochádzate :/("example.com") / path, a JsonVerbs, ktorý má túto metódu >#.

Tu je skrátená vzorka toho, ako vyhľadávam 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]
})))

Ako vidíte, mám správne dovozy (plus niektoré pre niektoré) Zdvihnite knižnice sa mi páčia) a moje Request potom „má“ a ># metóda. ja dávam ># funkcia, ktorá zodpovedá očakávanému podpisu ((JValue) ⇒ T) a ideme preč.

V prípade, že vás to zaujíma, používam výslovne schopnosť výťahu do tried prípadov, čo znamená T bude Device, Výťah, ale vyvolá tiež výnimku, ak nie je schopný previesť JValue na a Device, takže som celú svoju žiadosť zabalil Helper.tryo, pomocná metóda výťahu, ktorá zalomí pokus o prijatie a vráti znak a Box. Box je ako štandardná Scala Option ale s pridaním Failure, čo naznačuje, prečo a Box je prázdny. Takže v tomto prípade dostanem buď Full[Device] alebo a Failure, Praktický!