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]

Reply via email to