[akka-user] Re: Beginner's question: working with Futures inside Akka-HTTP 2 based API.
On Saturday, November 21, 2015 at 1:13:01 AM UTC-7, Dennis O wrote: > > Hi, > > Beginner question on Akka-http 2. > I have a GET route that will expose a value that I need to get from a > model. > Inside that model, I have Slick returning a Future. > > What is the "Akka-native" way to do this, i.e. Slick giving Future in the > model -> return to router/controller -> expose as Json? > If you don't need to do any additional processing, then the idiomatic way to do this would be to return the Future to your routes, then just complete. First, you need to decide on a Json library. I really like PlayJson. Add your JSON library to build.sbt: libraryDependencies ++= Seq( "de.heikoseeberger" %% "akka-http-json4s" % "1.2.1", "com.typesafe.play" %% "play-json" % "2.4.3" ) case class User(id: Int, email: String) object Users { def get(id: Int): Future[User] = { // ... } } object JsonFormats { // Create a read/write serializer for the User case class implicit val userFormat = Json.format[User] } class HttpService { import JsonFormats._ import de.heikoseeberger.akkahttpplayjson.PlayJsonSupport._ val route = path("user" / IntValue) { userId => val user: Future[User] = Users.get(userId) complete(user) } } Just like that. The import de.heikoseeberger.akkahttpplayjson.PlayJsonSupport._ tells akka-http to use Play-Json to look for implicit PlayJson formats in scope, and use them to output Json. Importing JsonFormats._ makes the User Json format visible to de.heikoseeberger.akkahttpplayjson.PlayJsonSupport. > > And also, do we actually need a Future in this case? Won't a > standard/blocking return be appropriate as front-end is waiting for > endpoint return anyways (and btw., waiting with a Promise of its own = in > Angular)? > Using a Future in Scala prevents Scala from blocking a thread. It's orthogonal to whether or not the client is blocking or not. > > Thanks! > Dennis > > > -- >> Read the docs: http://akka.io/docs/ >> Check the FAQ: >> http://doc.akka.io/docs/akka/current/additional/faq.html >> Search the archives: https://groups.google.com/group/akka-user --- You received this message because you are subscribed to the Google Groups "Akka User List" group. To unsubscribe from this group and stop receiving emails from it, send an email to akka-user+unsubscr...@googlegroups.com. To post to this group, send email to akka-user@googlegroups.com. Visit this group at http://groups.google.com/group/akka-user. For more options, visit https://groups.google.com/d/optout.
[akka-user] Re: Beginner's question: working with Futures inside Akka-HTTP 2 based API.
I erred. "de.heikoseeberger" %% "akka-http-json4s" % "1.2.1" should be " de.heikoseeberger" %% "akka-http-play-json" % "1.2.1". On Sunday, November 22, 2015 at 12:39:41 PM UTC-7, Tim Harper wrote: > > > > On Saturday, November 21, 2015 at 1:13:01 AM UTC-7, Dennis O wrote: >> >> Hi, >> >> Beginner question on Akka-http 2. >> I have a GET route that will expose a value that I need to get from a >> model. >> Inside that model, I have Slick returning a Future. >> >> What is the "Akka-native" way to do this, i.e. Slick giving Future in >> the model -> return to router/controller -> expose as Json? >> > > If you don't need to do any additional processing, then the idiomatic way > to do this would be to return the Future to your routes, then just complete. > > First, you need to decide on a Json library. I really like PlayJson. > > Add your JSON library to build.sbt: > > > libraryDependencies ++= Seq( > "de.heikoseeberger" %% "akka-http-json4s" % "1.2.1", > "com.typesafe.play" %% "play-json" % "2.4.3" > ) > > > > > > case class User(id: Int, email: String) > > object Users { > def get(id: Int): Future[User] = { > // ... > } > } > > object JsonFormats { > // Create a read/write serializer for the User case class > implicit val userFormat = Json.format[User] > } > > class HttpService { > import JsonFormats._ > import de.heikoseeberger.akkahttpplayjson.PlayJsonSupport._ > val route = > path("user" / IntValue) { userId => > val user: Future[User] = Users.get(userId) > complete(user) > } > } > > Just like that. The import > de.heikoseeberger.akkahttpplayjson.PlayJsonSupport._ tells akka-http to > use Play-Json to look for implicit PlayJson formats in scope, and use them > to output Json. Importing JsonFormats._ makes the User Json format > visible to de.heikoseeberger.akkahttpplayjson.PlayJsonSupport. > > >> >> And also, do we actually need a Future in this case? Won't a >> standard/blocking return be appropriate as front-end is waiting for >> endpoint return anyways (and btw., waiting with a Promise of its own = in >> Angular)? >> > > Using a Future in Scala prevents Scala from blocking a thread. It's > orthogonal to whether or not the client is blocking or not. > > >> >> Thanks! >> Dennis >> >> >> -- >> Read the docs: http://akka.io/docs/ >> Check the FAQ: >> http://doc.akka.io/docs/akka/current/additional/faq.html >> Search the archives: https://groups.google.com/group/akka-user --- You received this message because you are subscribed to the Google Groups "Akka User List" group. To unsubscribe from this group and stop receiving emails from it, send an email to akka-user+unsubscr...@googlegroups.com. To post to this group, send email to akka-user@googlegroups.com. Visit this group at http://groups.google.com/group/akka-user. For more options, visit https://groups.google.com/d/optout.
Re: [akka-user] Re: Beginner's question: working with Futures inside Akka-HTTP 2 based API.
Awesome reply, thanks Tim! We also have this documented (though for spray-json instead of play-json) in our docs here: http://doc.akka.io/docs/akka-stream-and-http-experimental/2.0-M1/scala/http/common/json-support.html Hope this helps! -- Cheers, Konrad 'ktoso’ Malawski Akka @ Typesafe On 22 November 2015 at 20:39:50, Tim Harper (timchar...@gmail.com) wrote: On Saturday, November 21, 2015 at 1:13:01 AM UTC-7, Dennis O wrote: Hi, Beginner question on Akka-http 2. I have a GET route that will expose a value that I need to get from a model. Inside that model, I have Slick returning a Future. What is the "Akka-native" way to do this, i.e. Slick giving Future in the model -> return to router/controller -> expose as Json? If you don't need to do any additional processing, then the idiomatic way to do this would be to return the Future to your routes, then just complete. First, you need to decide on a Json library. I really like PlayJson. Add your JSON library to build.sbt: libraryDependencies ++= Seq( "de.heikoseeberger" %% "akka-http-json4s" % "1.2.1", "com.typesafe.play" %% "play-json" % "2.4.3" ) case class User(id: Int, email: String) object Users { def get(id: Int): Future[User] = { // ... } } object JsonFormats { // Create a read/write serializer for the User case class implicit val userFormat = Json.format[User] } class HttpService { import JsonFormats._ import de.heikoseeberger.akkahttpplayjson.PlayJsonSupport._ val route = path("user" / IntValue) { userId => val user: Future[User] = Users.get(userId) complete(user) } } Just like that. The import de.heikoseeberger.akkahttpplayjson.PlayJsonSupport._ tells akka-http to use Play-Json to look for implicit PlayJson formats in scope, and use them to output Json. Importing JsonFormats._ makes the User Json format visible to de.heikoseeberger.akkahttpplayjson.PlayJsonSupport. And also, do we actually need a Future in this case? Won't a standard/blocking return be appropriate as front-end is waiting for endpoint return anyways (and btw., waiting with a Promise of its own = in Angular)? Using a Future in Scala prevents Scala from blocking a thread. It's orthogonal to whether or not the client is blocking or not. Thanks! Dennis -- >> Read the docs: http://akka.io/docs/ >> Check the FAQ: >> http://doc.akka.io/docs/akka/current/additional/faq.html >> Search the archives: https://groups.google.com/group/akka-user --- You received this message because you are subscribed to the Google Groups "Akka User List" group. To unsubscribe from this group and stop receiving emails from it, send an email to akka-user+unsubscr...@googlegroups.com. To post to this group, send email to akka-user@googlegroups.com. Visit this group at http://groups.google.com/group/akka-user. For more options, visit https://groups.google.com/d/optout. -- >> Read the docs: http://akka.io/docs/ >> Check the FAQ: >> http://doc.akka.io/docs/akka/current/additional/faq.html >> Search the archives: https://groups.google.com/group/akka-user --- You received this message because you are subscribed to the Google Groups "Akka User List" group. To unsubscribe from this group and stop receiving emails from it, send an email to akka-user+unsubscr...@googlegroups.com. To post to this group, send email to akka-user@googlegroups.com. Visit this group at http://groups.google.com/group/akka-user. For more options, visit https://groups.google.com/d/optout.