Is it possible to make a basic Akka HTTP client request inside an Actor?

Below is a simple actor who needs to make an HTTP call to receive data from the API. According to the client-level API based on the Akka HTTP core code , only ActorSystem and ActorMaterializer .

 class MyActor extends Actor { import context.system implicit val materializer = ActorMaterializer() override def receive: Receive = { case _ => { val responseFuture: Future[HttpResponse] = Http().singleRequest(HttpRequest(uri = "http://akka.io")) responseFuture onComplete { case Success(res) => println(res) case Failure(t) => println("An error has occured: " + t.getMessage) } } } } 

However, when I try to compile the application, I get the following error messages:

 Error:(18, 48) ambiguous implicit values: both value context in trait Actor of type => akka.actor.ActorContext and method system in trait ActorContext of type => akka.actor.ActorSystem match expected type akka.actor.ActorRefFactory implicit val materializer = ActorMaterializer() Error:(18, 48) implicit ActorRefFactory required: if outside of an Actor you need an implicit ActorSystem, inside of an actor this should be the implicit ActorContext implicit val materializer = ActorMaterializer() Error:(18, 48) not enough arguments for method apply: (implicit context: akka.actor.ActorRefFactory)akka.stream.ActorMaterializer in object ActorMaterializer. Unspecified value parameter context. implicit val materializer = ActorMaterializer() Error:(22, 70) could not find implicit value for parameter fm: akka.stream.Materializer val responseFuture: Future[HttpResponse] = Http().singleRequest(HttpRequest(uri = "http://akka.io")) Error:(22, 70) not enough arguments for method singleRequest: (implicit fm: akka.stream.Materializer)scala.concurrent.Future[akka.http.scaladsl.model.HttpResponse]. Unspecified value parameter fm. val responseFuture: Future[HttpResponse] = Http().singleRequest(HttpRequest(uri = "http://akka.io")) Error:(23, 22) Cannot find an implicit ExecutionContext. You might pass an (implicit ec: ExecutionContext) parameter to your method or import scala.concurrent.ExecutionContext.Implicits.global. responseFuture onComplete { Error:(23, 22) not enough arguments for method onComplete: (implicit executor: scala.concurrent.ExecutionContext)Unit. Unspecified value parameter executor. responseFuture onComplete { 

Is this the right way to make an HTTP call inside Akka Akka?

Edit

import ExecutionContext.Implicits.global included to fix the last two ExecutionContext errors.

+7
scala akka
source share
1 answer

Creating an ActorMaterializer requires an implicit ActorRefFactory. The context property defined in the Actor trait extends ActorRefFactory and implicitly. The system property in the context that you explicitly imported is another implicit candidate for ActorRefFactory, because ActorSystem extends ActorRefFactory.

My suggestion removes the import and passes it explicitly where necessary.

 class MyActor extends Actor { // Do not import context.system // import context.system implicit val materializer = ActorMaterializer() override def receive: Receive = { case _ => { // use context.system explicitly val responseFuture: Future[HttpResponse] = Http(context.system) .singleRequest(HttpRequest(uri = "http://akka.io")) responseFuture onComplete { case Success(res) => println(res) case Failure(t) => println("An error has occured: " + t.getMessage) } } } } 
+10
source

All Articles