Step 1: Send HTTP request
Description
This code uses Akka HTTP to request a file containing listed companies from the NASDAQ web site.
It starts the Actor System, imports the Actor System’s dispatcher as ExecutionContext
, and gets a stream materializer from the Actor System.
The HTTP request is created as value (it will be sent multiple times in later steps) and sets a specific HTTP request header.
The request is run in an Akka Stream from the single value, issuing the request by Akka HTTP, and printing out the HTTP response.
Once the stream completes, the Actor System is terminated and the program exits.
Code
- Java
-
source
/* * Copyright (C) 2016-2024 Lightbend Inc. <https://www.lightbend.com> */ package samples.javadsl; import akka.Done; import akka.actor.ActorSystem; import akka.http.javadsl.Http; import akka.http.javadsl.model.HttpRequest; import akka.http.javadsl.model.MediaRanges; import akka.http.javadsl.model.headers.Accept; import akka.stream.javadsl.Sink; import akka.stream.javadsl.Source; import java.util.Collections; import java.util.concurrent.CompletionStage; public class Main { public static void main(String[] args) throws Exception { Main me = new Main(); me.run(); } final HttpRequest httpRequest = HttpRequest.create( "https://www.nasdaq.com/screening/companies-by-name.aspx?exchange=NASDAQ&render=download") .withHeaders(Collections.singletonList(Accept.create(MediaRanges.ALL_TEXT))); private void run() throws Exception { ActorSystem system = ActorSystem.create(); Http http = Http.get(system); CompletionStage<Done> completion = Source.single(httpRequest) // : HttpRequest .mapAsync(1, http::singleRequest) // : HttpResponse .runWith(Sink.foreach(response -> System.out.println(response)), system); completion .thenAccept( done -> { System.out.println("Done!"); system.terminate(); }); } }
- Scala
-
source
/* * Copyright (C) 2016-2024 Lightbend Inc. <https://www.lightbend.com> */ package samples import akka.Done import akka.actor._ import akka.http.scaladsl._ import akka.http.scaladsl.model.StatusCodes._ import akka.http.scaladsl.model.headers.Accept import akka.http.scaladsl.model.{ HttpRequest, HttpResponse, MediaRanges } import akka.stream._ import akka.stream.scaladsl.{ Sink, Source } import akka.util.ByteString import scala.concurrent.Future object Main extends App { implicit val actorSystem = ActorSystem("alpakka-samples") import actorSystem.dispatcher val httpRequest = HttpRequest(uri = "https://www.nasdaq.com/screening/companies-by-name.aspx?exchange=NASDAQ&render=download") .withHeaders(Accept(MediaRanges.`text/*`)) val future: Future[Done] = Source .single(httpRequest) //: HttpRequest .mapAsync(1)(Http().singleRequest(_)) //: HttpResponse .runWith(Sink.foreach(println)) future.map { _ => println("Done!") actorSystem.terminate() } }