This is an automated email from the ASF dual-hosted git repository. fanningpj pushed a commit to branch marshallRequest in repository https://gitbox.apache.org/repos/asf/incubator-pekko-samples.git
commit fcb8733bb806d7eddbc9f65fbf1333d8c8673735 Author: Arnout Engelen <[email protected]> AuthorDate: Fri Nov 1 15:04:00 2019 +0100 Use Akka HTTP marshalling to marshall the JSON request data --- .../main/scala/sample/sharding/WeatherEdges.scala | 35 +++++++++++----------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/akka-sample-sharding-scala/src/main/scala/sample/sharding/WeatherEdges.scala b/akka-sample-sharding-scala/src/main/scala/sample/sharding/WeatherEdges.scala index 0bbc99a..6c46188 100644 --- a/akka-sample-sharding-scala/src/main/scala/sample/sharding/WeatherEdges.scala +++ b/akka-sample-sharding-scala/src/main/scala/sample/sharding/WeatherEdges.scala @@ -60,10 +60,15 @@ object WeatherHttpApi { final case class Data(stationId: Int, deviceId: Int, data: List[Double]) + // This formatter determines how to convert to and from Data objects: + import spray.json._ + import spray.json.DefaultJsonProtocol._ + implicit val dataFormat: RootJsonFormat[Data] = jsonFormat3(Data) + def apply(stationId: Int, port: Int): Behavior[Data] = Behaviors.setup[Data] { context => import akka.http.scaladsl.Http - import akka.http.scaladsl.model.{ ContentTypes, HttpEntity, HttpMethods, HttpRequest } + import akka.http.scaladsl.model.HttpRequest implicit val sys = context.system import context.executionContext @@ -74,23 +79,19 @@ object WeatherHttpApi { def runRequest(req: HttpRequest) = http.singleRequest(req).flatMap { _.entity.dataBytes.runReduce(_ ++ _) } + // This import makes the 'format' above available to the Akka HTTP + // marshalling infractructure used when constructing the Post below: + import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport._ + + import akka.http.scaladsl.client.RequestBuilding.Post + Behaviors.receiveMessage[Data] { - case Data(sid, did, data) => - // TODO marshalling vs scary hand-coded! - val values = data.mkString(",") - val json = s"""{"stationId":$sid,"deviceId":$did,"data":[$values]}""" - context.log.info("Read: {}", json) - - // See https://doc.akka.io/docs/akka-http/current/common/index.html - // for marshalling, unmarshalling, json support in the wild. - val httpEntity = HttpEntity(ContentTypes.`application/json`, json) - runRequest( - HttpRequest(method = HttpMethods.POST, uri = s"http://localhost:$port/temperatures", entity = httpEntity)) - .onComplete { - case Success(response) => - context.log.info(response.utf8String) - case Failure(e) => context.log.error("Something wrong.", e) - } + case data: Data => + runRequest(Post(s"http://localhost:$port/temperatures", data)).onComplete { + case Success(response) => + context.log.info(response.utf8String) + case Failure(e) => context.log.error("Something wrong.", e) + } Behaviors.same } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
