Jak zbudować interfejs API Hello World za pomocą Scala i Akka HTTP

Tak, to wciąż jest rzecz.

Akka to popularny zestaw narzędzi oparty na aktorach do tworzenia współbieżnych i rozproszonych aplikacji w JVM. Te aplikacje najczęściej używają Scali lub Java.

Posiada kilka modułów, które pomagają budować takie aplikacje, a Akka HTTP jest jednym z nich.

Akka HTTP ma zarówno narzędzia po stronie klienta, jak i po stronie serwera. W tym samouczku skupimy się na serwerze.

Powinieneś znać Scala i powinieneś mieć zainstalowane i zainstalowane SBT i IntelliJ. Jeśli tak nie jest, sprawdź oficjalną dokumentację.

Bez zbędnych ceregieli zbudujmy hello world API przy użyciu Scala i Akka HTTP!

Konfiguracja projektu

Możesz sklonować repozytorium, upewnij się, że korzystasz z oddziału 2.1-review-project.

Jeśli nie, użyjemy sbt 1.1.6i Scala 2.12.6. Sprawdź swoje pliki build.propertiesi build.sbt, aby upewnić się, że wersje tam pasują do tych.

Zacznijmy od dodania wymaganych zależności. Ponieważ protokół HTTP Akka zależy od aktorów i strumieni, będziemy musieli dodać również te biblioteki.

Dodaj następujący fragment na końcu build.sbtpliku:

libraryDependencies ++= Seq( "com.typesafe.akka" %% "akka-actor" % "2.5.13", "com.typesafe.akka" %% "akka-stream" % "2.5.13", "com.typesafe.akka" %% "akka-http" % "10.1.3",)

Jeśli pojawi się monit o włączenie automatycznego importu, zrób to. W przeciwnym razie możesz otworzyć terminal i cdprzejść do katalogu głównego projektu. Następnie uruchom, sbt updateaby uzyskać zależności.

Automatyczny import zapewni aktualizację projektu za każdym razem, gdy niektóre pliki zostaną zaktualizowane, w tym build.sbtplik.

Utwórz instancje zależności

Stwórzmy obiekt Scala o nazwie „src / main / scala” Server. Zaczniemy od utworzenia instancji zależności wymaganych do utworzenia serwera z protokołem Akka HTTP.

Najpierw obiekt rozszerzy Appcechę:

object Server extends App {}

Pozwoli to na uruchomienie naszego Serverobiektu.

Będziemy potrzebować hosta i portu, aby połączyć serwer, więc dodajmy je teraz:

val host = "0.0.0.0"val port = 9000

Ponieważ Akka HTTP używa aktorów Akka i strumieni pod spodem, będziemy musieli również dostarczyć ich zależności:

implicit val system: ActorSystem = ActorSystem("helloworld")implicit val executor: ExecutionContext = system.dispatcherimplicit val materializer: ActorMaterializer = ActorMaterializer()

Nawet jeśli nie musisz wiedzieć, co robią, aby rozpocząć tworzenie aplikacji Akka HTTP, zawsze dobrze jest wiedzieć, do czego służą.

An ActorSystemsłuży do zarządzania aktorami. Służy do ich tworzenia i wyszukiwania. Aktorzy w tym samym systemie zazwyczaj mają tę samą konfigurację.

ExecutionContextJest za wykonywania Futures. Wie, gdzie i jak powinien je wykonać, na przykład w puli wątków.

I wreszcie, ActorMaterializerjest odpowiedzialny za prowadzenie strumieni.

Po wykonaniu tych czynności możemy stworzyć naszą trasę hello!

Utwórz trasę

Aby utworzyć naszą trasę, użyjemy DSL routingu Akka HTTP. Opiera się na „warstwach” tego, co nazywa się dyrektywą. Aby uzyskać ogólne informacje, przejrzyj ich oficjalne dokumenty.

Dodaj trasę poniżej zależności:

def route = path("hello") { get { complete("Hello, World!") }}

Mamy pierwszą warstwę, w której próbujemy dopasować ścieżkę przychodzącego żądania jako „/ hello”. Jeśli nie pasuje, zostanie odrzucony.

Jeśli pasuje, spróbuje dopasować wewnętrzne „dyrektywy”. W naszym przypadku dopasowujemy żądania GET. Uzupełniamy cykl żądanie / odpowiedź komunikatem „Hello, World”.

Uruchom serwer

Po utworzeniu naszej trasy wystarczy tylko uruchomić serwer:

Http().bindAndHandle(route, host, port)

Wiążemy naszą trasę z podanym hostem i portem za pomocą Httpobiektu HTTP Akka .

Aby uruchomić nasz Serverobiekt, możesz kliknąć go prawym przyciskiem myszy i nacisnąć Uruchom „Serwer” .

Daj mu kilka sekund na kompilację, a następnie przejdź do przeglądarki. Przejdź do //localhost:9000/helloi powinieneś zobaczyć nasze „Hello, World!” wiadomość.

Fajnie, prawda?

Logowanie

Przed zakończeniem tego samouczka dodamy podstawowe logowanie do naszego serwera.

Być może zauważyłeś, że po uruchomieniu naszego Serverobiektu nie było żadnej informacji zwrotnej . Nie mamy pojęcia, czy to się udało, czy nie.

Możemy tylko założyć, że zadziałało, ponieważ aplikacja nie uległa awarii.

Dodajmy do tego trochę logowania.

If you look into the bindAndHandle function from the Http object, it returns a future of ServerBinding . We can hook some logs into the future’s onComplete function.

Let’s do that:

val bindingFuture = Http().bindAndHandle(route, host, port)bindingFuture.onComplete { case Success(serverBinding) => println(s"listening to ${serverBinding.localAddress}") case Failure(error) => println(s"error: ${error.getMessage}")}

Run the Server again, and this time you should see:

listening to /0:0:0:0:0:0:0:0:9000

Wrapping up

While using Scala and Akka HTTP is not the fastest way to develop APIs, it allows you to integrate other Akka modules, such as actors, streams, clusters, and more, making it easier to develop resilient and scalable systems.

Having said that, it’s good to keep in mind that developing an application using Scala and/or Akka doesn’t necessarily mean that it will be resilient and scalable. You’ll still need to perform work to accomplish that, but it’s easier than with other technologies.

If you liked Akka HTTP, we’ve got a free course that’ll quickstart your way into developing APIs with it. You’ll build an API for a Todo application, explained step by step. Check it out! ??

Akka HTTP Quickstart

Learn how to create web applications and APIs with Akka HTTP in this free course!link.codemunity.io