Akka(34): Http:Unmarshalling,from Json

   
 其实就首稿子是总揽为大学生写的,社会及重重直销,之前我们且让其传销,后来以军队的庞大,也无力回天一下子制止,国家给予了他们一个名位,美其名约:直销。对于直销的特性大部分口尚是知也传销,因为还是以拉人,做下线。但是自己还是希望大家都能理性之对比直销,因为微商也是中间同样种植。那么今天说的安利,其实我个人认为是发生浮动同直销的,因为它们再也可怕。它的可怕在于内部培训实在是不过巧了,棒到就你是单特别理性之丁,也会见时向她那里走,那么究竟那里发生什么吸引我之地方也?

 
Unmarshalling是Akka-http内把网上可传输格式的数量变化成为程序高级结构话数据的经过,比如把Json数据易成有自定义类型的实例。按实际流程来说就是优先管Json转换成为可传输格式数据要:MessageEntity,HttpRequest,HttpReponse等,然后还更换成程序高级结构数据如classXX实例。Unmarshalling对一个A类实例到B类实例的转移是透过Unmarshaller[A,B]来促成之:

1.我正好进安利凡是为大学社团里之一个吓爱人,因为咱们娱乐的生好,大学后依然保持联系,有雷同天她打来电话同自聊起她底近况,说好现在每日去放公益课,会召开猪蹄,会开蔓越莓饼干,披萨等等,而且它们说道的震动和兴奋,使自身毫不犹豫走上前了之环境。第一不成错过之时,我是依据着公益课去的,比如会起师让而什么保健,如何发展,如何被投机生活了之古雅,课程系列丰富多彩,这些科目都非常适合刚毕业的大学生,因为老师说了于这个条件里你会源源上,不断大力,不断遇到再好的大团结。听完课之后都发生一个享:要简明介绍自己,说下是何人带您前进之条件,今天之清醒。回来后难掩内心之欣,觉得好简直是捡拾到宝贝了,觉得同节公益课涉及到之学时2个小时才收15-20长,是未是很合算,这钱及过去凡AA场地费的。

trait Unmarshaller[-A, B] extends akka.http.javadsl.unmarshalling.Unmarshaller[A, B] {...}
object Unmarshaller
  extends GenericUnmarshallers
  with PredefinedFromEntityUnmarshallers
  with PredefinedFromStringUnmarshallers {

  // format: OFF

  //#unmarshaller-creation
  /**
   * Creates an `Unmarshaller` from the given function.
   */
  def apply[A, B](f: ExecutionContext ⇒ A ⇒ Future[B]): Unmarshaller[A, B] =
    withMaterializer(ec => _ => f(ec))
...}

2.次涂鸦错过是为求学护肤化妆方面的学识,当时失去的当儿是同一省完全的卸妆保养课,其实就是推销安利雅姿。刚过去的下,我之好爱人只是报自己听课,我怀念才十几块钱之课,听听对好来实益,就从来不推脱。但是后来去矣才发觉及时无异于理节课下来需要200,因为示范的导师说了,只能用安利的卸妆,加上他们的一样模仿拨筋护肤手法,才会生力量。当时自己于心里暗暗低估,这个不是变相传销吧,为什么好情人没有说清楚。没有艺术,想想还是购买了咔嚓,于是花了守500多。此后,我稍微起硌未情愿去矣,因为觉得老师在传安利的东西。

从Unmarshaller的构建函数apply可以估计其的企图应该跟函数A=>Future[B]充分相似。A代表网上可传输类型如MessageEntity、HttpRequest,B代表某种程序高级数据类型。因为A到B的更换是non-blocking的,所以可以就回去Future类型结果。Akka-http按被转换对象类型分类命名了底这些类别别名:

3.叔涂鸦错过之时段是情侣起吧想使开蔓越莓饼干和猪蹄给自家吃,一听吃的自家便兴奋了,而且开会所之导师不以那里,我的警觉心就是寿终正寝了,反正都是AA,自己也未正是,于是自己而跑过去。但是过去美食还未曾起多久,会所的教职工虽恢复了,然后盖自己莫会见召开食品,好情人当开,无聊时刻,老师虽待我以在茶几旁边喝茶聊天,给自己称了好多保健方面的业务,然后还看自己之指头,看手相,他们给手诊。然后说只要多补血巴拉巴拉一堆话,然后还带本人参观安利产品,然后说了投机为当凭着,举了几乎单实例,说安利是只了不起之事业,巴拉巴拉。终于当及蔓越莓和猪蹄了,开吃的当儿气氛特别好,大家都充分吃的上马。也发出说有乐,不说其他的。

type FromEntityUnmarshaller[T] = Unmarshaller[HttpEntity, T]
type FromMessageUnmarshaller[T] = Unmarshaller[HttpMessage, T]
type FromResponseUnmarshaller[T] = Unmarshaller[HttpResponse, T]
type FromRequestUnmarshaller[T] = Unmarshaller[HttpRequest, T]
type FromByteStringUnmarshaller[T] = Unmarshaller[ByteString, T]
type FromStringUnmarshaller[T] = Unmarshaller[String, T]
type FromStrictFormFieldUnmarshaller[T] = Unmarshaller[StrictForm.Field, T]

4.自己妈妈知道自家去矣一点潮,但是我还未曾说错过安利,只说去学习。然后久了我妈就说啊学习那么晚回家,我才说出安利。于是它大怒,说我家隔壁老邻居之前的老大哥吃了蛋白粉没长高的事情。还说安利很吓人。那自己再也使错过看下安利里面到底是怎开的。安利人员大部分白天错过开了为客户,晚上才会展开集会与上学。这次是去押家用产品演示,可能以上次处了张卡,所以更信任自己了。而那又买入了同样瓶浓缩家用洗洁精和牙膏牙刷。这次拘留了重重相对而言试验,其实这当其它行业也够呛广阔,就未具体描述了。

Akka-http对以下项目提供了自行的Unmarshalling转换: 

5.第五潮去之上,是去听FQ演讲,我只能说安利培养的红颜个个演讲口才了得,没有两把刷子还当真上无了华。而且演讲的教职工没有让你端庄罐鸡汤,画大饼,而是经过有例子来验证安利的好,也就是是她们的奖金制度,因为这制度是延续的,如果您长眠了,你孩子好收获你的财产,就是这事业是可持续的。当时放来好刺激哦,怎么这样深。

PredefinedFromStringUnmarshallers
Byte
Short
Int
Long
Float
Double
Boolean
PredefinedFromEntityUnmarshallers
Array[Byte]
ByteString
Array[Char]
String
akka.http.scaladsl.model.FormData
GenericUnmarshallers
Unmarshaller[T, T] (identity unmarshaller)
Unmarshaller[Option[A], B], if an Unmarshaller[A, B] is available
Unmarshaller[A, Option[B]], if an Unmarshaller[A, B] is available

6.第六次于我带来了自的好爱人过去,我就算比如之前带自己进安利的慌好爱人一样,和导师等配合,开始“引”好友进入这个圈子,猜猜看我带的凡谁?—就是我邻居家的兄长。他虽不是杀了解是,但是他说了团结前面的经历,老师的回答是先前的直销人员还没有养好,现在无等同了。而且还说了众多东西,具体内容大概是安利及原先差了,现在发互联网+,安利的前景无限量等等。但是那次后,我还为从来不夺,一凡是以时间的题目。二凡我觉着温馨到底自律性不错的总人口,学习了好去图书馆或者上网,途径很多。再说我们刚毕业地基还从来不牢,别一心想方当时挣快钱。

也就是说Akka-http提供了这些U类型的Unmarshaller[U,B]隐式实例。Akka-http也提供了工具类Unmarshal:

总结:自家莫可知说谁直销不好或者好,害人或者不害人。但是综观经济以及政治,大国里的策略是咱这些小人物不懂得的,就比如之前听说说安利的蛋白粉都是转基因,但是有人会反驳,那怎么中国引进安利,为什么奥运会运动健儿还吃为?一,中国当引入前从无知情安利凡是呀性质,而且安利也非可能说出其是啊性质。引进安利足解决就业,可以……肯定有便宜才引进。运动员吃是是互补体能,运动员的大强度运动要能维持,而我辈是小人物,至于是不是长久用,用了出无来影响,我们不得而知,我们设理性对待,不吃安利的尚是碰头择其他牌子的,为什么非挑一个进入中华正如漫长的牌,也许……说实话,作为中华丁,我或会有点偏于华,谁不思量协调之国强,谁不思量协调的儿孙繁衍生息,宁愿错过一个,也无克于祥和国家之便宜受损。更何况关乎民族之满贯利益。当然既然是了,这东西自然有市场.安利的清洁剂和洗洁精,牙膏等出品都是甚正确的,我家至少6个亲属在用.但是涉及吃的,我们中国口恐怕再次偏于受食疗.当然作为国人,不管网上传言想用改变基因破话种之事体是免是真的,我怀念不待我们去决定,怕不怕转变吃.建议大学生可以去安利这个平台锻炼下,毕竟她提倡的博值观面的事物都十分主动,而且培训的情吧可说都是比实用的.加不加入安利,这个是私房选择题材,我并未身份干涉。只望看就首的人头都能转化下,不欲打赏。

object Unmarshal {
  def apply[T](value: T): Unmarshal[T] = new Unmarshal(value)
}

class Unmarshal[A](val value: A) {
  /**
   * Unmarshals the value to the given Type using the in-scope Unmarshaller.
   *
   * Uses the default materializer [[ExecutionContext]] if no implicit execution context is provided.
   * If you expect the marshalling to be heavy, it is suggested to provide a specialized context for those operations.
   */
  def to[B](implicit um: Unmarshaller[A, B], ec: ExecutionContext = null, mat: Materializer): Future[B] = {
    val context: ExecutionContext = if (ec == null) mat.executionContext else ec

    um(value)(context, mat)
  }
}

我们可以经过Unmarshal.to[B]把Unmarshal[A]转换成Future[B]。注意:这无异步只包了于网上可传输类型及程序类型转换这同样经过,不包括实际实现时之Json转换。下面是局部Unmarshal的用例:

import akka.actor._
import akka.stream._
import akka.http.scaladsl.unmarshalling.Unmarshal
import akka.http.scaladsl.model._
import akka.http.scaladsl.server.Directives._

object Unmarshalling {
  implicit val httpSys = ActorSystem("httpSystem")
  implicit val httpMat = ActorMaterializer()
  implicit val httpEC = httpSys.dispatcher

  val futInt = Unmarshal(43).to[Int]
  val futBoolean = Unmarshal("0").to[Boolean]
  val futString = Unmarshal(HttpEntity("Hello")).to[String]
  val futHello = Unmarshal(HttpRequest(method = HttpMethods.GET, entity = HttpEntity("hello")))

}

如上都是早已知道路中变换,可能没什么实际用,不像marshalling:中间层Marshalling有实际转换的需要。Unmarshalling可以直接开展Json到自定义类型中的更换,如:

 val route = (path("User") & post) { entity(as[User]){ user =>
    complete(Future(s"inserting user: $user"))
  }} ~
    (path("Item"/IntNumber) & put) { id => entity(as[Item]){ item =>
      complete(Future(s"update item $id: $item"))
    }}

以上是经过Directive
as[???]实现的:

 /**
   * Returns the in-scope [[FromRequestUnmarshaller]] for the given type.
   *
   * @group marshalling
   */
  def as[T](implicit um: FromRequestUnmarshaller[T]) = um

当即需要拿FromRequestUmarshaller[T]放在可视域内,FromRequestUmarshaller[T]实际是Unmarshaller[T,B]的别名: 

type FromRequestUnmarshaller[T] = Unmarshaller[HttpRequest, T]

在上篇讨论我们介绍了Akka-http的Marshalling是type-class模式的。其中首要得参考上篇讨论。现在我们要这些Unmarshaller的隐式实例:

trait Formats extends SprayJsonSupport with DefaultJsonProtocol
object Converters extends Formats {
  case class User(id: Int, name: String)
  case class Item(id: Int, name: String, price: Double)
  implicit val itemFormat = jsonFormat3(Item.apply)
  implicit val userFormat = jsonFormat2(User.apply)
}

object Unmarshalling {
  import Converters._
...

要以Json4s的落实方式,我们需要如下提供这些隐式实例:

trait JsonCodec extends Json4sSupport {
  import org.json4s.DefaultFormats
  import org.json4s.ext.JodaTimeSerializers
  implicit val serilizer = jackson.Serialization
  implicit val formats = DefaultFormats ++ JodaTimeSerializers.all
}
object JsConverters extends JsonCodec

Json4s的实际用例如下:

  import scala.collection.mutable._
  case class User(id: Int, name: String)
  class Item(id: Int, name: String, price: Double)
  object AnyPic {
    val area = 10
    val title = "a picture"
    val data = ArrayBuffer[Byte](1,2,3)
  }

  val route = (path("User") & post) { entity(as[User]){ user =>
    complete(Future(s"inserting user: $user"))
  }} ~
    (path("Item"/IntNumber) & put) { id => entity(as[Item]){ item =>
      complete(Future(s"update item $id: $item"))
    }} ~
    (path("Picture") & put) { entity(as[AnyPic.type]){ pic =>
      complete(Future(s"insert picture: $pic"))
    }}

自功能上与表达灵活性来讲,Json4s的兑现方式使占优。

脚就此次讨论的示范源代码:

Unmarshalling

import akka.actor._
import akka.stream._
import akka.http.scaladsl.unmarshalling.Unmarshal
import akka.http.scaladsl.model._
import akka.http.scaladsl.server.Directives._
import scala.concurrent._
import akka.http.scaladsl.marshallers.sprayjson._
import spray.json._

trait Formats extends SprayJsonSupport with DefaultJsonProtocol
object Converters extends Formats {
  case class User(id: Int, name: String)
  case class Item(id: Int, name: String, price: Double)
  implicit val itemFormat = jsonFormat3(Item.apply)
  implicit val userFormat = jsonFormat2(User.apply)
}

object Unmarshalling {
  import Converters._
  implicit val httpSys = ActorSystem("httpSystem")
  implicit val httpMat = ActorMaterializer()
  implicit val httpEC = httpSys.dispatcher

  val futInt = Unmarshal(43).to[Int]
  val futBoolean = Unmarshal("0").to[Boolean]
  val futString = Unmarshal(HttpEntity("Hello")).to[String]
  val futHello = Unmarshal(HttpRequest(method = HttpMethods.GET, entity = HttpEntity("hello")))

  val route = (path("User") & post) { entity(as[User]){ user =>
    complete(Future(s"inserting user: $user"))
  }} ~
    (path("Item"/IntNumber) & put) { id => entity(as[Item]){ item =>
      complete(Future(s"update item $id: $item"))
    }}

}

Json4sUnmarshalling

import akka.actor._
import akka.stream._
import akka.http.scaladsl.server.Directives._
import de.heikoseeberger.akkahttpjson4s.Json4sSupport
import org.json4s.jackson
import scala.concurrent._
trait JsonCodec extends Json4sSupport {
  import org.json4s.DefaultFormats
  import org.json4s.ext.JodaTimeSerializers
  implicit val serilizer = jackson.Serialization
  implicit val formats = DefaultFormats ++ JodaTimeSerializers.all
}
object JsConverters extends JsonCodec


object Json4sUnmarshalling {
  import JsConverters._
  implicit val httpSys = ActorSystem("httpSystem")
  implicit val httpMat = ActorMaterializer()
  implicit val httpEC = httpSys.dispatcher

  import scala.collection.mutable._
  case class User(id: Int, name: String)
  class Item(id: Int, name: String, price: Double)
  object AnyPic {
    val area = 10
    val title = "a picture"
    val data = ArrayBuffer[Byte](1,2,3)
  }

  val route = (path("User") & post) { entity(as[User]){ user =>
    complete(Future(s"inserting user: $user"))
  }} ~
    (path("Item"/IntNumber) & put) { id => entity(as[Item]){ item =>
      complete(Future(s"update item $id: $item"))
    }} ~
    (path("Picture") & put) { entity(as[AnyPic.type]){ pic =>
      complete(Future(s"insert picture: $pic"))
    }}
}