簡體   English   中英

如何使用Scala和Akka-Http 10.0.5使用簡單的Restful服務

[英]How to consume a simple Restful service with Scala and Akka-Http 10.0.5

我花了整整一天的時間來弄清楚

  1. 使用遠程Restful JSON服務
  2. 將有效載荷解組(反序列化)為案例類模型

谷歌加Akka郵件列表中的人非常有幫助,所以我認為也有一個關於SO的有效示例,以供將來參考是很好的。

Akka-Http 10.0.5


package xxx

import akka.actor.ActorSystem
import akka.http.scaladsl.Http
import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport
import akka.http.scaladsl.model._
import akka.http.scaladsl.unmarshalling.Unmarshal
import akka.stream.{ActorMaterializer, Materializer}
import org.scalatest.concurrent.ScalaFutures
import org.scalatest.{BeforeAndAfter, FlatSpec, MustMatchers}
import org.scalatest.mock.MockitoSugar
import spray.json.DefaultJsonProtocol
import scala.concurrent.{Await, ExecutionContextExecutor, Future}
import akka.http.scaladsl.server.Directives

case class ColorBlob(url: String, averageColor: String, classificationColor: String)
case class ColorBlobsResponse(colorBlobs: Map[String, Option[ColorBlob]])

trait JsonSupport extends SprayJsonSupport with DefaultJsonProtocol {
   implicit val format1 = jsonFormat3(ColorBlob)
   implicit val format2 = jsonFormat1(ColorBlobsResponse)
}

class ColorBlobRestTest
   extends FlatSpec
   with MockitoSugar
   with BeforeAndAfter
   with MustMatchers
   with ScalaFutures
   with JsonSupport
   with Directives {

   implicit val system: ActorSystem = ActorSystem()
   implicit val executor: ExecutionContextExecutor = system.dispatcher
   implicit val materializer: Materializer = ActorMaterializer()

   "this" should "work" in {
       val request = HttpRequest(method = HttpMethods.GET, uri = s"https://colorservice/colorblobs/en?productCodes=904655")
       val futureResponse: Future[HttpResponse] = Http().singleRequest(request)

       val futureColorBlobResponse: Future[ColorBlobsResponse] = futureResponse.flatMap { response: HttpResponse =>
           val entity: ResponseEntity = response.entity
           Unmarshal(entity).to[ColorBlobsResponse]
       }

       import scala.concurrent.duration._
       val colorBlobsResponse: ColorBlobsResponse = Await.result(futureColorBlobResponse, 1000.millis)

       assert(1==1)

    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM