From 339108e9bc024dbb984898153e6953efb421f820 Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Thu, 18 Apr 2024 15:42:15 +0200 Subject: [PATCH] doc: Include quickstart in docs (#4381) * with zip files to download * check samples in ci * akka-http.version * release issue * no ./sbt * remove intellij page --- .github/workflows/check-samples.yml | 81 +++++++ .github/workflows/publish.yml | 1 + .gitignore | 3 + build.sbt | 4 + docs/release-train-issue-template.md | 4 +- docs/src/main/paradox/contributing.md | 2 +- docs/src/main/paradox/introduction.md | 27 +-- docs/src/main/paradox/native-image.md | 2 +- .../paradox/quickstart-java/backend-actor.md | 15 ++ .../paradox/quickstart-java/http-server.md | 127 +++++++++++ .../images/hello-akka-http.png | Bin 0 -> 128923 bytes .../src/main/paradox/quickstart-java/index.md | 186 +++++++++++++++++ docs/src/main/paradox/quickstart-java/json.md | 19 ++ .../running-the-application.md | 33 +++ .../paradox/quickstart-java/testing-routes.md | 73 +++++++ .../paradox/quickstart-scala/backend-actor.md | 15 ++ .../paradox/quickstart-scala/http-server.md | 133 ++++++++++++ .../images/hello-akka-http.png | Bin 0 -> 128923 bytes .../main/paradox/quickstart-scala/index.md | 197 ++++++++++++++++++ .../src/main/paradox/quickstart-scala/json.md | 40 ++++ .../running-the-application.md | 32 +++ .../quickstart-scala/testing-routes.md | 106 ++++++++++ docs/src/main/paradox/reference.md | 2 +- docs/src/main/paradox/release-notes/index.md | 2 +- docs/src/main/paradox/routing-dsl/index.md | 2 +- samples/akka-http-quickstart-java/README.md | 34 +++ samples/akka-http-quickstart-java/pom.xml | 104 +++++++++ .../main/java/com/example/QuickstartApp.java | 62 ++++++ .../main/java/com/example/UserRegistry.java | 88 ++++++++ .../src/main/java/com/example/UserRoutes.java | 112 ++++++++++ .../src/main/resources/application.conf | 6 + .../src/main/resources/logback.xml | 20 ++ .../test/java/com/example/UserRoutesTest.java | 77 +++++++ .../src/test/resources/application-test.conf | 3 + samples/akka-http-quickstart-scala/README.md | 30 +++ samples/akka-http-quickstart-scala/build.sbt | 30 +++ .../project/build.properties | 1 + .../project/plugins.sbt | 1 + .../src/main/resources/application.conf | 6 + .../src/main/resources/logback.xml | 20 ++ .../main/scala/com/example/JsonFormats.scala | 18 ++ .../scala/com/example/QuickstartApp.scala | 44 ++++ .../main/scala/com/example/UserRegistry.scala | 43 ++++ .../main/scala/com/example/UserRoutes.scala | 79 +++++++ .../src/test/resources/application-test.conf | 3 + .../scala/com/example/UserRoutesSpec.scala | 96 +++++++++ scripts/prepare-downloads.sh | 73 +++++++ 47 files changed, 2026 insertions(+), 30 deletions(-) create mode 100644 .github/workflows/check-samples.yml create mode 100644 docs/src/main/paradox/quickstart-java/backend-actor.md create mode 100644 docs/src/main/paradox/quickstart-java/http-server.md create mode 100644 docs/src/main/paradox/quickstart-java/images/hello-akka-http.png create mode 100644 docs/src/main/paradox/quickstart-java/index.md create mode 100644 docs/src/main/paradox/quickstart-java/json.md create mode 100644 docs/src/main/paradox/quickstart-java/running-the-application.md create mode 100644 docs/src/main/paradox/quickstart-java/testing-routes.md create mode 100644 docs/src/main/paradox/quickstart-scala/backend-actor.md create mode 100644 docs/src/main/paradox/quickstart-scala/http-server.md create mode 100644 docs/src/main/paradox/quickstart-scala/images/hello-akka-http.png create mode 100644 docs/src/main/paradox/quickstart-scala/index.md create mode 100644 docs/src/main/paradox/quickstart-scala/json.md create mode 100644 docs/src/main/paradox/quickstart-scala/running-the-application.md create mode 100644 docs/src/main/paradox/quickstart-scala/testing-routes.md create mode 100644 samples/akka-http-quickstart-java/README.md create mode 100644 samples/akka-http-quickstart-java/pom.xml create mode 100644 samples/akka-http-quickstart-java/src/main/java/com/example/QuickstartApp.java create mode 100644 samples/akka-http-quickstart-java/src/main/java/com/example/UserRegistry.java create mode 100644 samples/akka-http-quickstart-java/src/main/java/com/example/UserRoutes.java create mode 100644 samples/akka-http-quickstart-java/src/main/resources/application.conf create mode 100644 samples/akka-http-quickstart-java/src/main/resources/logback.xml create mode 100644 samples/akka-http-quickstart-java/src/test/java/com/example/UserRoutesTest.java create mode 100644 samples/akka-http-quickstart-java/src/test/resources/application-test.conf create mode 100644 samples/akka-http-quickstart-scala/README.md create mode 100644 samples/akka-http-quickstart-scala/build.sbt create mode 100644 samples/akka-http-quickstart-scala/project/build.properties create mode 100644 samples/akka-http-quickstart-scala/project/plugins.sbt create mode 100644 samples/akka-http-quickstart-scala/src/main/resources/application.conf create mode 100644 samples/akka-http-quickstart-scala/src/main/resources/logback.xml create mode 100644 samples/akka-http-quickstart-scala/src/main/scala/com/example/JsonFormats.scala create mode 100644 samples/akka-http-quickstart-scala/src/main/scala/com/example/QuickstartApp.scala create mode 100644 samples/akka-http-quickstart-scala/src/main/scala/com/example/UserRegistry.scala create mode 100644 samples/akka-http-quickstart-scala/src/main/scala/com/example/UserRoutes.scala create mode 100644 samples/akka-http-quickstart-scala/src/test/resources/application-test.conf create mode 100644 samples/akka-http-quickstart-scala/src/test/scala/com/example/UserRoutesSpec.scala create mode 100755 scripts/prepare-downloads.sh diff --git a/.github/workflows/check-samples.yml b/.github/workflows/check-samples.yml new file mode 100644 index 00000000000..7161e023c41 --- /dev/null +++ b/.github/workflows/check-samples.yml @@ -0,0 +1,81 @@ +name: Check samples + +on: + push: + branches: + - main + +concurrency: + # Only run once for latest commit per ref and cancel other (previous) runs. + group: ci-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + +jobs: + check-samples: + name: Check Sample Projects + runs-on: ubuntu-22.04 + steps: + - name: Checkout + # https://github.com/actions/checkout/releases + # v4.1.1 + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 + with: + fetch-depth: 0 + + - name: Checkout GitHub merge + if: github.event.pull_request + run: |- + git fetch origin pull/${{ github.event.pull_request.number }}/merge:scratch + git checkout scratch + + - name: Cache Coursier cache + # https://github.com/coursier/cache-action/releases + # v6.4.5 + uses: coursier/cache-action@1ff273bff02a8787bc9f1877d347948af647956d + + - name: Set up JDK 17 + # https://github.com/coursier/setup-action/releases + # v1.3.5 + uses: coursier/setup-action@7bde40eee928896f074dbb76d22dd772eed5c65f + with: + jvm: temurin:1.17 + + - name: Gather version + # some cleanup of the sbt output to get the version sbt will use when publishing below + run: |- + sbt --no-colors "print akka-actor/version" | tail -n 1 | tr -d '\n' > ~/.version + echo [$(cat ~/.version)] + # useful for debugging: hexdump -c ~/.version + + - name: Publish artifacts locally + run: |- + sbt "publishLocal; publishM2" + + - name: Test akka-http-quickstart-java + run: |- + cd samples/akka-http-quickstart-java + mvn test -nsu -ntp -Dakka-http.version=`cat ~/.version` + + - name: Test akka-http-quickstart-scala + run: |- + cd samples/akka-http-quickstart-scala + sbt test -Dakka-http.version=`cat ~/.version` + + - name: Email on failure + if: ${{ failure() }} + uses: dawidd6/action-send-mail@6063705cefe50cb915fc53bb06d4049cae2953b2 + with: + server_address: smtp.gmail.com + server_port: 465 + secure: true + username: ${{secrets.MAIL_USERNAME}} + password: ${{secrets.MAIL_PASSWORD}} + subject: "Failed: ${{ github.workflow }} / ${{ github.job }}" + to: ${{secrets.MAIL_SEND_TO}} + from: Akka CI + body: | + Job ${{ github.job }} in workflow ${{ github.workflow }} of ${{github.repository}} failed! + https://github.com/${{github.repository}}/actions/runs/${{github.run_id}} diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index e0de3a46b9f..c5b93cd2321 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -83,6 +83,7 @@ jobs: - name: Publish run: |- + scripts/prepare-downloads.sh eval "$(ssh-agent -s)" echo $AKKA_RSYNC_GUSTAV | base64 -d > .github/id_rsa chmod 600 .github/id_rsa diff --git a/.gitignore b/.gitignore index a4336c12e4e..0ac755bff42 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,6 @@ target *.vim .ensime* .bsp + +# attachments created by scripts/prepare-downloads.sh +docs/src/main/paradox/attachments diff --git a/build.sbt b/build.sbt index 7314464393e..5705808b31b 100644 --- a/build.sbt +++ b/build.sbt @@ -483,6 +483,10 @@ lazy val docs = project("docs") writer = new Writer(serializerPlugins = Writer.defaultPlugins(paradoxDirectives.value))) }, paradoxGroups := Map("Language" -> Seq("Scala", "Java")), + paradoxRoots := List( + "index.html", + "quickstart-java/index.html", + "quickstart-scala/index.html"), Compile / paradoxProperties ++= Map( "project.name" -> "Akka HTTP", "canonical.base_url" -> "https://doc.akka.io/docs/akka-http/current", diff --git a/docs/release-train-issue-template.md b/docs/release-train-issue-template.md index 7a997198fc4..caa3670a041 100644 --- a/docs/release-train-issue-template.md +++ b/docs/release-train-issue-template.md @@ -18,6 +18,7 @@ Key links: - [ ] Check that open PRs and issues assigned to the milestone are reasonable - [ ] Update the Change date in the LICENSE file. +- [ ] Update the Akka HTTP version in the samples to $VERSION$, otherwise the published zip files of the samples will have the old version. - [ ] For minor or major versions, add a release notes entry in `docs/src/main/paradox/release-notes/`. - [ ] Create a new milestone for the [next version](https://github.com/akka/akka-http/milestones) - [ ] Close the [$VERSION$ milestone](https://github.com/akka/akka-http/milestones?direction=asc&sort=due_date) @@ -72,8 +73,7 @@ For minor or major releases: - [ ] Add the released version to `project/MiMa.scala` to the `mimaPreviousArtifacts` key *of all current compatible branches*. - [ ] Update [akka-dependencies bom](https://github.com/lightbend/akka-dependencies) and version for [Akka module versions](https://doc.akka.io/docs/akka-dependencies/current/) in [akka-dependencies repo](https://github.com/akka/akka-dependencies) - [ ] Update [Akka Guide samples](https://github.com/akka/akka-platform-guide) -- [ ] Update quickstarts: - - [ ] [Akka HTTP Java](https://github.com/akka/akka-http-quickstart-java.g8/blob/main/src/main/g8/default.properties) +- [ ] Update sbt new (g8) template: - [ ] [Akka HTTP Scala](https://github.com/akka/akka-http-quickstart-scala.g8/blob/main/src/main/g8/default.properties) - Close this issue diff --git a/docs/src/main/paradox/contributing.md b/docs/src/main/paradox/contributing.md index fa927558eb1..042a688e1ed 100644 --- a/docs/src/main/paradox/contributing.md +++ b/docs/src/main/paradox/contributing.md @@ -1,4 +1,4 @@ -# 9. Contributing +# 10. Contributing ## Welcome! diff --git a/docs/src/main/paradox/introduction.md b/docs/src/main/paradox/introduction.md index 92fc2d7701b..a34ef4eea25 100644 --- a/docs/src/main/paradox/introduction.md +++ b/docs/src/main/paradox/introduction.md @@ -53,29 +53,10 @@ Additionally, add the dependencies as below. group3="com.typesafe.akka" artifact3="akka-http_$scala.binary.version$" version3="AkkaHttpVersion" } -You may download a packaged version of this project by clicking "Create a project for me!" on the -@scala[[Lightbend Getting Started page](https://developer.lightbend.com/start/?group=akka&project=akka-http-quickstart-scala)] -@java[[Lightbend Getting Started page](https://developer.lightbend.com/start/?group=akka&project=akka-http-quickstart-java)]. +You may download a packaged version of this project from: -Alternatively, you can bootstrap a new project with Akka HTTP already configured using the [Giter8](http://www.foundweekends.org/giter8/) template directly via sbt: - -@@@ div { .group-scala } -For Scala (sbt) -: ```sh - sbt new akka/akka-http-quickstart-scala.g8 - ``` -@@@ -@@@ div { .group-java } -For Java (Maven or Gradle) -: ```sh - sbt new akka/akka-http-quickstart-java.g8 - ``` -From there on the prepared project can be built using Gradle or Maven. -@@@ - -More instructions can be found on the @scala[[template -project](https://github.com/akka/akka-http-quickstart-scala.g8)]@java[[template -project](https://github.com/akka/akka-http-quickstart-java.g8)]. +* @ref[Akka HTTP Quickstart for Scala](quickstart-scala/index.md) +* @ref[Akka HTTP Quickstart for Java](quickstart-java/index.md) ## Routing DSL for HTTP servers @@ -255,4 +236,4 @@ akka-http-jackson @@@ akka-http-jwt -: Provides directives for validating and extracting JSON Web Tokens (JWT) from requests. Details can be found in the section @ref[JWT Directives](routing-dsl/directives/jwt-directives/jwt.md) \ No newline at end of file +: Provides directives for validating and extracting JSON Web Tokens (JWT) from requests. Details can be found in the section @ref[JWT Directives](routing-dsl/directives/jwt-directives/jwt.md) diff --git a/docs/src/main/paradox/native-image.md b/docs/src/main/paradox/native-image.md index 8fc3409bf9a..a413e0bdec2 100644 --- a/docs/src/main/paradox/native-image.md +++ b/docs/src/main/paradox/native-image.md @@ -1,4 +1,4 @@ -# Building Native Images +# 9. Building Native Images Building native images with Akka HTTP is supported. diff --git a/docs/src/main/paradox/quickstart-java/backend-actor.md b/docs/src/main/paradox/quickstart-java/backend-actor.md new file mode 100644 index 00000000000..d74dd80c7a3 --- /dev/null +++ b/docs/src/main/paradox/quickstart-java/backend-actor.md @@ -0,0 +1,15 @@ +Backend Actor logic +------------------- + +In this example, the backend only uses one basic actor. In a real system, we would have many actors interacting with each other and perhaps, multiple data stores and microservices. + +An interesting side-note to add here is about when using actors in applications like this adds value over just providing functions that would return `CompletionStage`s. +In fact, if your logic is stateless and very simple request/reply style, you may not need to back it with an Actor. Actors do shine when you need to keep some form of state and allow various requests to access something in (or *through*) an Actor. The other stellar feature of actors, that futures would not handle, is scaling-out onto a cluster very easily, by using @extref[Cluster Sharding](akka-docs:typed/cluster-sharding.html) or other @extref[location-transparent](akka-docs:general/remoting.html) techniques. + +However, the focus of this tutorial is on how to interact with an Actor backend from within Akka HTTP -- not on the actor itself, so we'll keep it very simple. + +The sample code in the `UserRegistry` is very simple. It keeps registered users in a `Set`. Once it receives messages it matches them to the defined cases to determine which action to take: + +@@snip [UserRegistry.java](/samples/akka-http-quickstart-java/src/main/java/com/example/UserRegistry.java) { #user-registry-actor } + +If you feel you need to brush up on your Akka Actor knowledge, the @extref[Getting Started Guide](akka-docs:guide/index.html)reviews actor concepts in the context of a simple Internet of Things (IoT) example. diff --git a/docs/src/main/paradox/quickstart-java/http-server.md b/docs/src/main/paradox/quickstart-java/http-server.md new file mode 100644 index 00000000000..f862698c4aa --- /dev/null +++ b/docs/src/main/paradox/quickstart-java/http-server.md @@ -0,0 +1,127 @@ +HTTP Server Logic +----------------- + +The main class, `QuickstartServer`, is runnable because it has a `main` method, as shown in the following snippet. +This class is intended to "bring it all together", it is the main class that will start the `ActorSystem` with the root +behavior which bootstraps all actors and other dependencies (database connections etc). + +@@snip [QuickstartServer.java](/samples/akka-http-quickstart-java/src/main/java/com/example/QuickstartApp.java) { #main-class } + +Notice that we've separated out the `UserRoutes` class, in which we'll put all our actual route definitions. +This is a good pattern to follow, especially once your application starts to grow and you'll need some form of +compartmentalizing them into groups of routes handling specific parts of the exposed API. + +## Binding endpoints + +Each Akka HTTP `Route` contains one or more `akka.http.javadsl.server.Directive`, such as: `path`, `get`, `post`, `complete`, etc. There is also a @ref[low-level API](../server-side/low-level-api.md) that allows to inspect requests and create responses manually. For the user registry service, the example needs to support the actions listed below. For each, we can identify a path, the HTTP method, and return value: + +| Functionality | HTTP Method | Path | Returns | +|--------------------|-------------|------------|----------------------| +| Create a user | POST | /users | Confirmation message | +| Retrieve a user | GET | /users/$ID | JSON payload | +| Remove a user | DELETE | /users/$ID | Confirmation message | +| Retrieve all users | GET | /users | JSON payload | + +In our app the definition of the `Route` is separated out into the class `UserRoutes` and available through the factory method `userRoutes`. + +In larger applications we'd define separate subsystems in different places and then combine combine the various routes of our +application into a big using the concat directive like this: `Route route = concat(UserRoutes.userRoutes(), healthCheckRoutes, ...)` + +Let's look at the pieces of the example `Route` that bind the endpoints, HTTP methods, and message or payload for each action. + +### Retrieving and creating users + +The definition of the endpoint to retrieve and create users look like the following: + +@@snip [UserRoutes.java](/samples/akka-http-quickstart-java/src/main/java/com/example/UserRoutes.java) { #users-get-post } + +A Route is constructed by nesting various *directives* which route an incoming request to the apropriate handler block. +Note the following building blocks from the snippet: + +**Generic functionality** + +The following directives are used in the above example: + +* `pathPrefix("users")` : the path that is used to match the incoming request against. +* `pathEnd` : used on an inner-level to discriminate “path already fully matched” from other alternatives. Will, in this case, match on the "users" path. +* `concat`: concatenates two or more route alternatives. Routes are attempted one after another. If a route rejects a request, the next route in the chain is attempted. This continues until a route in the chain produces a response. If all route alternatives reject the request, the concatenated route rejects the route as well. In that case, route alternatives on the next higher level are attempted. If the root level route rejects the request as well, then an error response is returned that contains information about why the request was rejected. + +**Retrieving users** + +* `get` : matches against `GET` HTTP method. +* `complete` : completes a request which means creating and returning a response from the arguments. + +**Creating a user** + +* `post` : matches against `POST` HTTP method. +* `entity(Unmarshaller, T -> Directive))` : converts the HTTP request body into a domain object of type User. Implicitly, we assume that the request contains application/json content. We will look at how this works in the @ref:[JSON](json.md) section. +* `complete` : completes a request which means creating and returning a response from the arguments which can be different combinations of a HTTP status code, an object to "marshall" into a response body using a marshaller parameter. + +### Retrieving and removing a user + +Next, the example defines how to retrieve and remove a user. In this case, the URI must include the user's id in the form: `/users/$ID`. See if you can identify the code that handles that in the following snippet. This part of the route includes logic for both the GET and the DELETE methods. + +@@snip [QuickstartServer.java](/samples/akka-http-quickstart-java/src/main/java/com/example/UserRoutes.java) { #users-get-delete } + +This part of the `Route` contains the following: + +**Generic functionality** + +The following directives are used in the above example: + +* `pathPrefix("users")` : the path that is used to match the incoming request against. +* `concat`: concatenates two or more route alternatives. Routes are attempted one after another. If a route rejects a request, the next route in the chain is attempted. This continues until a route in the chain produces a response. +* `path(Segment) { user =>` : this bit of code matches against URIs of the exact format `/users/$ID` and the `Segment` is automatically extracted into the `user` variable so that we can get to the value passed in the URI. For example `/users/Bruce` will populate the `user` variable with the value "Bruce." There is plenty of more features available for handling of URIs, see @ref[pattern matchers](../routing-dsl/path-matchers.md#basic-pathmatchers) for more information. + +**Retrieving a user** + +* `get` : matches against `GET` HTTP method. +* `complete` : completes a request which means creating and returning a response from the arguments. + +Let's break down the logic handling the incoming request: + +@@snip [UserRoutes.java](/samples/akka-http-quickstart-java/src/main/java/com/example/UserRoutes.java) { #retrieve-user-info } + +The `rejectEmptyResponse` here above is a convenience method that automatically unwraps a future, handles an `Option` by converting `Some` into a successful response, returns a HTTP status code 404 for `None`, and passes on to the `ExceptionHandler` in case of an error, which returns the HTTP status code 500 by default. + +**Deleting a user** + +* `delete` : matches against the Http directive `DELETE`. + +The logic for handling delete requests is as follows: + +@@snip [UserRoutes.java](/samples/akka-http-quickstart-java/src/main/java/com/example/UserRoutes.java) { #users-delete-logic } + +So we send an instruction about removing a user to the user registry actor, wait for the response and return an appropriate HTTP status code to the client. + +## The complete Route + +Below is the complete `Route` definition from the sample application: + +@@snip [UserRoutes.java](/samples/akka-http-quickstart-java/src/main/java/com/example/UserRoutes.java) { #all-routes } + +Note that one might want to separate those routes into smaller route values and `concat` them together into the `userRoutes` +value - allowing for separation of concerns and get smaller routing trees. + +## Binding the HTTP server + +Binding the `Route` to a HTTP server on a TCP port is done from the root behavior actor on startup through the separate method +`startHttpServer`, we have introduced it to avoid accidentally accessing internal state of the bootstrap actor. + +The `bindAndhandle` method that does the actual binding takes three parameters; `routes`, the hostname, and the port. +Note that binding happens asynchronously and therefore the `bindAndHandle` method returns a `Future` which completes with +an object representing the binding or fails if binding the HTTP route failed, for example if the port is already taken. + +To make sure our application stops if it cannot bind we terminate the actor system if there is a failure. + +@@snip [QuickstartApp.java](/samples/akka-http-quickstart-java/src/main/java/com/example/QuickstartApp.java) { #start-http-server } + +In `QuickstartApp.java`, you will also find the code that ties everything together by starting the various actors in a +root behavior. By watching the user registry actor and not handling the `Terminated` message we make sure that if + it stops or craches the root behavior crashes and stops the `ActorSystem` itself. + +@@snip [QuickstartApp.java](/samples/akka-http-quickstart-java/src/main/java/com/example/QuickstartApp.java) { #main-class } + + + +Let's move on to the actor that handles registration. diff --git a/docs/src/main/paradox/quickstart-java/images/hello-akka-http.png b/docs/src/main/paradox/quickstart-java/images/hello-akka-http.png new file mode 100644 index 0000000000000000000000000000000000000000..951e3a8296e0f0c5e6a34c39919fabca96679ab3 GIT binary patch literal 128923 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�N;a6NbEiTuNyFuiF;Otr^rH3oM&^xXNedG>ac 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 G^M3%O=L>}Z literal 0 HcmV?d00001 diff --git a/docs/src/main/paradox/quickstart-java/index.md b/docs/src/main/paradox/quickstart-java/index.md new file mode 100644 index 00000000000..88c02d0cbfd --- /dev/null +++ b/docs/src/main/paradox/quickstart-java/index.md @@ -0,0 +1,186 @@ +Akka HTTP Quickstart for Java +============================= + +Akka HTTP offers a general toolkit for providing and consuming HTTP-based services. The Akka HTTP modules implement a full server- and client-side HTTP stack on top of `akka-actor` and `akka-stream`. A typical application does not sit on top of Akka HTTP. Instead, Akka HTTP makes it easier to build integration layers based on HTTP, and therefore stays on the sidelines. This allows you to base your app on what makes sense and use Akka HTTP for HTTP integration. + +Akka HTTP is not a framework--not because we don't like frameworks--but to provide maximum flexibility. For example, you might use the Play framework to implement browser-based interactions or Lagom framework for creating microservices, both of them are also based on Akka. + +Akka HTTP follows a rather open design and often offers several APIs for accomplishing the same thing. You can choose the API with the level of abstraction that best suits your application. If you have trouble achieving something using a high-level API, you can probably find a lower-level API to use. The low-level APIs offer more flexibility, but might require you to write more application code. + +This guide highlights Akka HTTP fundamentals in the context of a simple user registry [REST service](https://en.wikipedia.org/wiki/Representational_state_transfer). Within 30 minutes, you should be able to: + +* Download the quickstart project and run the app. +* Follow this guide to explore the code. + +## Prerequisite + +Having a basic understanding of Akka actors will make it easier to understand the example. +If you are new to Akka, we recommend completing the +@extref[Akka Quickstart](akka-docs:typed/actors.html#first-example) before this tutorial. + +You can run the Akka HTTP example project on Linux, MacOS, or Windows. The only prerequisite is Java 17 or later, and +an installation of [maven](https://maven.apache.org/index.html). + +## Downloading the example + +The Akka HTTP example for Java is a zipped project that includes a maven build file. Download and unzip the example as follows: + +1. Download the project [zip file](../attachments/akka-http-quickstart-java.zip). +2. Extract the zip file to a convenient location. + +* On Linux and MacOS systems, open a terminal and use the command `unzip` akka-quickstart-java.zip. +* On Windows, use a tool such as File Explorer to extract the project. + +## Running the example + +To run Hello World: + +In a console, change directories to the top level of the unzipped project. + +For example, if you used the default project name, `akka-http-quickstart`, and extracted the project +to your root directory, from the root directory, enter: `cd akka-http-quickstart` + +Start with: + +``` +mvn compile exec:exec +``` + +When you run mvn, it downloads project dependencies, builds the project, starts an Akka HTTP server, and runs the example application. + +The output should look something like this: + +``` +[INFO] --- exec:3.0.0:exec (default-cli) @ akka-http-seed-java --- +[2024-04-18 07:42:11,718] [INFO] [akka.event.slf4j.Slf4jLogger] [HelloAkkaHttpServer-akka.actor.default-dispatcher-4] [] - Slf4jLogger started +[2024-04-18 07:42:11,980] [INFO] [akka.actor.typed.ActorSystem] [ForkJoinPool.commonPool-worker-1] [] - Server online at http://127.0.0.1:8080/ +``` + +The Akka HTTP server is now running, and you can test it by sending simple HTTP requests. + +You can restart it by `ctrl-c` and run `mvn` again. + +## Example app overview + +The user registry example contains functionality for adding, retrieving, or deleting a single user and for retrieving all users. Akka HTTP provides a [domain-specific language](https://en.wikipedia.org/wiki/Domain-specific_language) (DSL) to simplify the definition of endpoints as a `Route`. In this example, a `Route` defines: the paths `/users` and `/user`, the available HTTP methods, and when applicable, parameters or payloads. + +When the example app starts up, it creates an ActorSystem with a `UserRegistry` Actor and binds the defined routes to a port, in this case, `localhost:8080`. When the endpoints are invoked, they interact with the `UserRegistry` Actor, which contains the business logic. The diagram below illustrates runtime behavior, where that the HTTP server receives for the defined `route` endpoints, which are handled by the `UserRegistry` actor: + +![Architecture](images/hello-akka-http.png) + +## Exercising the example + +To get started, try registering and retrieving a few users. You simply need to know the appropriate parameters for the requests. In our example app, each user has a `name`, an `age`, and a `countryOfResidence`. + +You pass request parameters in JSON format. While you could do this in a browser, it is much simpler to use one of the following: + +* A command line tool, such as [cURL](https://en.wikipedia.org/wiki/CURL). +* Browser add-ons such as [RESTClient](http://restclient.net/) for Firefox or Postman for Chrome. + +Follow the steps appropriate for your tool: + +* [cURL commands](#cURL-commands) +* [Browser-based tools](#Browser-based-tools) + +### cURL commands + +Open a shell that supports cURL and follow these steps to add and retrieve users: + +Copy and paste the following lines to create a few users (enter one command at a time): + +``` +curl -H "Content-type: application/json" -X POST -d '{"name": "MrX", "age": 31, "countryOfResidence": "Canada"}' http://localhost:8080/users + +curl -H "Content-type: application/json" -X POST -d '{"name": "Anonymous", "age": 55, "countryOfResidence": "Iceland"}' http://localhost:8080/users + +curl -H "Content-type: application/json" -X POST -d '{"name": "Bill", "age": 67, "countryOfResidence": "USA"}' http://localhost:8080/users +``` + +The system should respond after each command to verify that the user was created. + +To retrieve all users, enter the following command: + +``` +curl http://localhost:8080/users +``` + +The system responds with the list of users: + +``` +{"users":[{"name":"Anonymous","age":55,"countryOfResidence":"Iceland"},{"name":"MrX","age":31,"countryOfResidence":"Canada"},{"name":"Bill","age":67,"countryOfResidence":"USA"}]} +``` + +To retrieve a specific user, enter the following command: + +``` +curl http://localhost:8080/users/Bill +``` + +The system should respond with the following: + +``` +{"name":"Bill","age":67,"countryOfResidence":"USA"} +``` + +Finally, it is possible to delete users: + +``` +curl -X DELETE http://localhost:8080/users/Bill +``` + +The response should be: + +``` +User Bill deleted. +``` + +### Browser-based clients + +Open a tool such as RESTClient or Postman and follow these steps to create and retrieve users: + +To create users: + +1. Select the `POST` method. +1. Enter the URL: `http://localhost:8080/users` +1. Set the Header to `Content-Type: application/json`. +1. In the body, copy and paste the following lines to create three users (send each payload separately). Note: for Postman, you might need to specify that you want to send `raw` data. + +``` +{"name": "MrX", "age": 31, "countryOfResidence": "Canada"} + +{"name": "Anonymous", "age": 55, "countryOfResidence": "Iceland"} + +{"name": "Bill", "age": 67, "countryOfResidence": "USA"} +``` + +The system should respond after each command to verify that the user was created. + +To retrieve all users: + +1. Select the `GET` method. +1. Enter the URL: `http://localhost:8080/users` +1. Send the request. + +The system should respond with a list of users in JSON format. + +## Learning from the example + +Congratulations, you just ran and exercised your first Akka HTTP app! You got a preview of how routes make it easy to communicate over HTTP. + +The example is implemented in the following three source files: + +* `QuickstartApp.java` -- contains the main method which bootstraps the application +* `UserRoutes.java` -- Akka HTTP `routes` defining exposed endpoints +* `UserRegistry.java` -- the actor which handles the registration requests + +First, let's dissect the backend logic. + +@@@index + +* [The Actor backend](backend-actor.md) +* [The HTTP server](http-server.md) +* [JSON](json.md) +* [Running the application](running-the-application.md) +* [Testing Routes](testing-routes.md) + +@@@ diff --git a/docs/src/main/paradox/quickstart-java/json.md b/docs/src/main/paradox/quickstart-java/json.md new file mode 100644 index 00000000000..af8fa5d1852 --- /dev/null +++ b/docs/src/main/paradox/quickstart-java/json.md @@ -0,0 +1,19 @@ +JSON marshalling +---------------- + +When exercising the app, you interacted with JSON payloads. How does the example app convert data between JSON format and data that can be used by Java classes? Fur this purposes Akka HTTP has `akka.http.javadsl.marshallers.jackson.Jackson` + +We're using the [Jackson](https://github.com/FasterXML/jackson) library here, along with akka-http wrapper that provides marshallers `Jackson.marshaller()`. + +In most cases you'll just need to provide the Jackson marshaller to `complete` call like following `complete(StatusCodes.OK, performed, Jackson.marshaller()` to be able to product JSON response. + +To create objects from JSON you'll need to create unmarshaller with class as attribute `Jackson.unmarshaller(User.class)` +That will work out of the box where you are using mutable Java Bean style objects with getters and setters but +in this sample we have instead used immutable messages and domain model classes which has no other methods than a constructor, the fields are all final and public. To make Jacksson understand how to create such objects from JSON this we need to provide some extra metadata in the form of the annotations `@JsonCreator` and `@JsonProperty`: + +@@snip [UserRegistryActor.java](/samples/akka-http-quickstart-java/src/main/java/com/example/UserRegistry.java) { #user-case-classes } + +While we used Jackson JSON in this example, the API is pluggable and various other libraries can be used. Each library comes with different trade-offs in performance and user-friendlieness. Still Jackson is the default Java marshaller as that is what we expect Java developers to be most familiar with. + +Now that we've examined the example app thoroughly, let's test a few remaining use cases. + diff --git a/docs/src/main/paradox/quickstart-java/running-the-application.md b/docs/src/main/paradox/quickstart-java/running-the-application.md new file mode 100644 index 00000000000..4c9e74bad66 --- /dev/null +++ b/docs/src/main/paradox/quickstart-java/running-the-application.md @@ -0,0 +1,33 @@ +Running the application +----------------------- + +When you run the example for the first time, you were able to create and retrieve multiple users. Now that you understand how the example is implemented, let's confirm that the rest of the functionality works. We want to verify that: + +* If we try to retrieve users when none exist, we get an empty list. +* If we try to retrieve a particular user that doesn't exist, we get an informative message. +* We can delete users. + +To test this functionality, follow these steps. If you need reminders on starting the app or sending requests, refer to the @ref:[instructions](index.md#exercising-the-example) in the beginning. + +`1.` If the Akka HTTP server is still running, stop and restart it. +`2.` With no users registered, use your tool of choice to: +`3.` Retrieve a list of users. Hint: use the `GET` method and append `/users` to the URL. + +You should get back an empty list: `{"users":[]}` + +`4.` Try to retrieve a single user named `MrX`. Hint: use the `GET` method and append `users/MrX` to the URL. + +You should get back the message: `User MrX is not registered.` + +`5.` Try adding one or more users. Hint: use the `POST` method, append `/users` to the +URL, and format the data in JSON, similar to: `{"name":"MrX","age":31,"countryOfResidence":"Canada"}` + +You should get back the message: `User MrX created.` + +`6.` Try deleting a user you just added. Hint: use the `DELETE`, and append `/users/` to the URL. + +You should get back the message: `User MrX deleted.` + +## Tutorial done! + +Congratulations! You can start building real-world applications that use Akka HTTP. Of course, we didn't have time to cover all Akka HTTP features in this short guide. See the @ref[documentation](../index.md) to learn more. diff --git a/docs/src/main/paradox/quickstart-java/testing-routes.md b/docs/src/main/paradox/quickstart-java/testing-routes.md new file mode 100644 index 00000000000..cb8d6f3e23a --- /dev/null +++ b/docs/src/main/paradox/quickstart-java/testing-routes.md @@ -0,0 +1,73 @@ +Testing routes +-------------- + +If you remember when we started out with our `QuickstartApp`, we decided to put the routes themselves into a separate class. Back there we said that we're doing this to separate the infrastructure code (setting up the actor system and wiring up all the dependencies and actors), from the routes, which should only declare what they need to work with, and can, therefore, be a bit more focused on their task at hand. This, of course, leads us to better testability. + +This separation, other than being a good idea on its own, was all for this moment! For when we want to write tests to cover all our routes, without having to bring up the entire application. + +## Unit testing routes + +There are multiple ways one can test an HTTP application of course, but lets start at the simplest and also quickest way: unit testing. In this style of testing, we won't even need to spin up an actual server - all the tests will be executed on the routes directly - without the need of hitting actual network. This is due to Akka HTTP's pure design and separation between the network layer (represented as a bi-directional `Flow` of byte strings to Http domain objects). + +In other words, unit testing in Akka HTTP is simply "executing" the routes by passing in an `HttpResponse` to the route, and later inspecting what `HttpResponse` (or `rejection` if the request could not be handled) it resulted in. All this in-memory, without having to start a real HTTP server - which gives us supreme speed and turn-over time when developing an application using Akka. + +First we'll need to extend a number of base traits: + +@@snip [QuickstartServer.java](/samples/akka-http-quickstart-java/src/test/java/com/example/UserRoutesTest.java) { #test-top } + +Here we're using `JUnitRouteTest` which provides ability to test akka-http routes. + +Next, we'll need to bring into the test class our routes that we want to test. We're doing this by wrapping put rout +into `TestRoute` by using `testRoute(server.createRoute())` to be able to provide request parameters to emulate HTTP call +and then assert results. You can assert HTML body or header values as well as response code itself. + +@@snip [QuickstartServer.java](/samples/akka-http-quickstart-java/src/test/java/com/example/UserRoutesTest.java) { #set-up } + +We could create an actor that replies with a mocked response here instead if we wanted to, this is especially useful if +the route awaits an response from the actor before rendering the `HttpResponse` to the client. +Let's write our first test, in which we'll hit the `/users` endpoint with a `GET` request: + +@@snip [QuickstartServer.java](/samples/akka-http-quickstart-java/src/test/java/com/example/UserRoutesTest.java) { #actual-test } + +We simply construct a raw `HttpRequest` object and pass it into the route using the `run`. +Next, we do the same and pipe the result of that route into a check block, so the full syntax is: +`appRoute.run(HttpRequest.GET("/users"))`. + +Inside the check block we can inspect all kinds of attributes of the received response, like `status`, `contentType` etc. +Checking looks like following: `assertStatusCode(StatusCodes.OK).assertMediaType("application/json")` + +In the next test we'd like test a `POST` endpoint, so we need to send an entity to the endpoint in order to create a new +`User`. We are using similar approach `HttpRequest.POST("/users")` to what we have for GET test. + +@@snip [QuickstartServer.java](/samples/akka-http-quickstart-java/src/test/java/com/example/UserRoutesTest.java) { #testing-post } + +### Complete unit unit test code listing + +For reference, here's the entire unit test code: + +@@snip [QuickstartServer.java](/samples/akka-http-quickstart-java/src/test/java/com/example/UserRoutesTest.java) + + +## A note Integration testing routes + +While definitions of "what a pure unit-test is" are sometimes a subject of fierce debates in programming communities, +we refer to the above testing style as "route unit testing" since it's lightweight and allows to test the routes in +isolation, especially if their dependencies would be mocked our with test stubs, instead of hitting real APIs. + +Sometimes, however, one wants to test the complete "full application", including starting a real HTTP server + +@@@ warning + + Some network specific features like timeouts, behavior of entities (streamed directly from the network, instead of + in memory objects like in the unit testing style) may behave differently in the unit-testing style showcased above. + + If you want to test specific timing and entity draining behaviors of your apps you may want to add full integration + tests for them. For most routes this should not be needed, however, we'd recommend doing so when using more of + the streaming features of Akka HTTP. + +@@@ + +Usually, such tests would be implemented by starting the application the same way as we started it in the `QuickstartServer`, +in `@BeforeClass` method, then hitting the API with http requests using the HTTP Client and asserting on the responses, +finally shutting down the server in `@AfterClass` . + diff --git a/docs/src/main/paradox/quickstart-scala/backend-actor.md b/docs/src/main/paradox/quickstart-scala/backend-actor.md new file mode 100644 index 00000000000..30ae598d0be --- /dev/null +++ b/docs/src/main/paradox/quickstart-scala/backend-actor.md @@ -0,0 +1,15 @@ +Backend Actor logic +------------------- + +In this example, the backend only uses one basic actor. In a real system, we would have many actors interacting with each other and perhaps, multiple data stores and microservices. + +An interesting side-note to add here is about when using actors in applications like this adds value over just providing functions that would return `Future`s. +In fact, if your logic is stateless and very simple request/reply style, you may not need to back it with an Actor. Actors do shine however when you need to keep some form of state and allow various requests to access something in (or *through*) an Actor. The other stellar feature of actors, that futures would not handle, is scaling-out onto a cluster very easily, by using @extref[Cluster Sharding](akka-docs:typed/cluster-sharding.html) or other @extref[location-transparent](akka-docs:general/remoting.html) techniques. + +However, the focus of this tutorial is on how to interact with an Actor backend from within Akka HTTP -- not on the actor itself, so we'll keep it very simple. + +The sample code in the `UserRegistry` is very simple. It keeps registered users in a `Set`. Once it receives messages it matches them to the defined cases to determine which action to take: + +@@snip [UserRegistry.scala](/samples/akka-http-quickstart-scala/src/main/scala/com/example/UserRegistry.scala) { #user-registry-actor } + +If you feel you need to brush up on your Akka Actor knowledge, the @extref[Getting Started Guide](akka-docs:guide/index.html) reviews actor concepts in the context of a simple Internet of Things (IoT) example. diff --git a/docs/src/main/paradox/quickstart-scala/http-server.md b/docs/src/main/paradox/quickstart-scala/http-server.md new file mode 100644 index 00000000000..133d614b21e --- /dev/null +++ b/docs/src/main/paradox/quickstart-scala/http-server.md @@ -0,0 +1,133 @@ +HTTP Server Logic +----------------- + +The main class, `QuickstartServer`, is runnable because it has a `main` method, as shown in the following snippet. +This class is intended to "bring it all together", it is the main class that will start the `ActorSystem` with the root +behavior which bootstraps all actors and other dependencies (database connections etc). + +@@snip [QuickstartApp.scala](/samples/akka-http-quickstart-scala/src/main/scala/com/example/QuickstartApp.scala) { #main-class } + +Notice that we've separated out the `UserRoutes` class, in which we'll put all our actual route definitions. +This is a good pattern to follow, especially once your application starts to grow and you'll need some form of +compartmentalizing them into groups of routes handling specific parts of the exposed API. + +## Binding endpoints + +Each Akka HTTP `Route` contains one or more `akka.http.scaladsl.server.Directives`, such as: `path`, `get`, `post`, `complete`, etc. There is also a @ref[low-level API](../server-side/low-level-api.md) that allows to inspect requests and create responses manually. For the user registry service, the example needs to support the actions listed below. For each, we can identify a path, the HTTP method, and return value: + +| Functionality | HTTP Method | Path | Returns | +|--------------------|-------------|------------|----------------------| +| Create a user | POST | /users | Confirmation message | +| Retrieve a user | GET | /users/$ID | JSON payload | +| Remove a user | DELETE | /users/$ID | Confirmation message | +| Retrieve all users | GET | /users | JSON payload | + +In our app the definition of the `Route` is separated out into the class `UserRoutes` and available through the field `userRoutes`. + +In larger applications we'd define separate subsystems in different places and then combine combine the various routes of our +application into a big using the concat directive like this: `val route = concat(UserRoutes.userRoutes, healthCheckRoutes, ...)` + +Let's look at the pieces of the example `Route` that bind the endpoints, HTTP methods, and message or payload for each action. + +### Retrieving and creating users + +The definition of the endpoint to retrieve and create users look like the following: + +@@snip [UserRoutes.scala](/samples/akka-http-quickstart-scala/src/main/scala/com/example/UserRoutes.scala) { #users-get-post } + +A Route is constructed by nesting various *directives* which route an incoming request to the apropriate handler block. +Note the following building blocks from the snippet: + +**Generic functionality** + +The following directives are used in the above example: + +* `pathPrefix("users")` : the path that is used to match the incoming request against. +* `pathEnd` : used on an inner-level to discriminate “path already fully matched” from other alternatives. Will, in this case, match on the "users" path. +* `concat`: concatenates two or more route alternatives. Routes are attempted one after another. If a route rejects a request, the next route in the chain is attempted. This continues until a route in the chain produces a response. If all route alternatives reject the request, the concatenated route rejects the route as well. In that case, route alternatives on the next higher level are attempted. If the root level route rejects the request as well, then an error response is returned that contains information about why the request was rejected. + * This can also be achieved using the `~` operator, like this: `exampleRoute ~ anotherRoute`. + However this method is slightly more error-prone since forgetting to add the `~` between routes in subsequent lines + will not result in a compile error (as it would when using the `concat` directive) resulting in only the "last" route to be returned.
+
+ In short other words: you may see the `~` operator used in Akka HTTP apps, however it is recommended to use the `concat` directive as safer alternative. + +**Retrieving users** + +* `get` : matches against `GET` HTTP method. +* `complete` : completes a request which means creating and returning a response from the arguments. + +**Creating a user** + +* `post` : matches against `POST` HTTP method. +* `entity(as[User])` : converts the HTTP request body into a domain object of type User. Implicitly, we assume that the request contains application/json content. We will look at how this works in the @ref:[JSON](json.md) section. +* `complete` : completes a request which means creating and returning a response from the arguments. Note, how the tuple `(StatusCodes.Created, "...")` of type `(StatusCode, String)` is implicitly converted to a response with the given status code and a text/plain body with the given string. + +### Retrieving and removing a user + +Next, the example defines how to retrieve and remove a user. In this case, the URI must include the user's id in the form: `/users/$ID`. See if you can identify the code that handles that in the following snippet. This part of the route includes logic for both the GET and the DELETE methods. + +@@snip [QuickstartServer.scala](/samples/akka-http-quickstart-scala/src/main/scala/com/example/UserRoutes.scala) { #users-get-delete } + +This part of the `Route` contains the following: + +**Generic functionality** + +The following directives are used in the above example: + +* `pathPrefix("users")` : the path that is used to match the incoming request against. +* `concat`: concatenates two or more route alternatives. Routes are attempted one after another. If a route rejects a request, the next route in the chain is attempted. This continues until a route in the chain produces a response. +* `path(Segment) { user =>` : this bit of code matches against URIs of the exact format `/users/$ID` and the `Segment` is automatically extracted into the `user` variable so that we can get to the value passed in the URI. For example `/users/Bruce` will populate the `user` variable with the value "Bruce." There is plenty of more features available for handling of URIs, see @ref[pattern matchers](../routing-dsl/path-matchers.md#basic-pathmatchers) for more information. + +**Retrieving a user** + +* `get` : matches against `GET` HTTP method. +* `complete` : completes a request which means creating and returning a response from the arguments. + +Let's break down the logic handling the incoming request: + +@@snip [UserRoutes.scala](/samples/akka-http-quickstart-scala/src/main/scala/com/example/UserRoutes.scala) { #retrieve-user-info } + +The `rejectEmptyResponse` here above is a convenience method that automatically unwraps a future, handles an `Option` by converting `Some` into a successful response, returns a HTTP status code 404 for `None`, and passes on to the `ExceptionHandler` in case of an error, which returns the HTTP status code 500 by default. + +**Deleting a user** + +* `delete` : matches against the Http directive `DELETE`. + +The logic for handling delete requests is as follows: + +@@snip [UserRoutes.scala](/samples/akka-http-quickstart-scala/src/main/scala/com/example/UserRoutes.scala) { #users-delete-logic } + +So we send an instruction about removing a user to the user registry actor, wait for the response and return an appropriate HTTP status code to the client. + + +## The complete Route + +Below is the complete `Route` definition from the sample application: + +@@snip [UserRoutes.scala](/samples/akka-http-quickstart-scala/src/main/scala/com/example/UserRoutes.scala) { #all-routes } + +Note that one might want to separate those routes into smaller route values and `concat` them together into the `userRoutes` +value - allowing for separation of concerns and get smaller routing trees. + +## Binding the HTTP server + +Binding the `Route` to a HTTP server on a TCP port is done from the root behavior actor on startup through the separate method +`startHttpServer`, we have introduced it to avoid accidentally accessing internal state of the bootstrap actor. + +The `bindAndhandle` method that does the actual binding takes three parameters; `routes`, the hostname, and the port. +Note that binding happens asynchronously and therefore the `bindAndHandle` method returns a `Future` which completes with +an object representing the binding or fails if binding the HTTP route failed, for example if the port is already taken. + +To make sure our application stops if it cannot bind we terminate the actor system if there is a failure. + +@@snip [QuickstartApp.scala](/samples/akka-http-quickstart-scala/src/main/scala/com/example/QuickstartApp.scala) { #start-http-server } + +In `QuickstartApp.scala`, you will also find the code that ties everything together by starting the various actors in a +root behavior. By watching the user registry actor and not handling the `Terminated` message we make sure that if + it stops or craches the root behavior crashes and stops the `ActorSystem` itself. + +@@snip [QuickstartApp.scala](/samples/akka-http-quickstart-scala/src/main/scala/com/example/QuickstartApp.scala) { #main-class } + + + +Let's move on to the actor that handles registration. diff --git a/docs/src/main/paradox/quickstart-scala/images/hello-akka-http.png b/docs/src/main/paradox/quickstart-scala/images/hello-akka-http.png new file mode 100644 index 0000000000000000000000000000000000000000..951e3a8296e0f0c5e6a34c39919fabca96679ab3 GIT binary patch literal 128923 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�N;a6NbEiTuNyFuiF;Otr^rH3oM&^xXNedG>ac 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 G^M3%O=L>}Z literal 0 HcmV?d00001 diff --git a/docs/src/main/paradox/quickstart-scala/index.md b/docs/src/main/paradox/quickstart-scala/index.md new file mode 100644 index 00000000000..890862b482b --- /dev/null +++ b/docs/src/main/paradox/quickstart-scala/index.md @@ -0,0 +1,197 @@ +Akka HTTP Quickstart for Scala +============================== + +Akka HTTP offers a general toolkit for providing and consuming HTTP-based services. The Akka HTTP modules implement a full server- and client-side HTTP stack on top of `akka-actor` and `akka-stream`. A typical application does not sit on top of Akka HTTP. Instead, Akka HTTP makes it easier to build integration layers based on HTTP, and therefore stays on the sidelines. This allows you to base your app on what makes sense and use Akka HTTP for HTTP integration. + +Akka HTTP is not a framework--not because we don't like frameworks--but to provide maximum flexibility. For example, you might use the Play framework to implement browser-based interactions or Lagom framework for creating microservices, both of them are also based on Akka. + +Akka HTTP follows a rather open design and often offers several APIs for accomplishing the same thing. You can choose the API with the level of abstraction that best suits your application. If you have trouble achieving something using a high-level API, you can probably find a lower-level API to use. The low-level APIs offer more flexibility, but might require you to write more application code. + +This guide highlights Akka HTTP fundamentals in the context of a simple user registry [REST service](https://en.wikipedia.org/wiki/Representational_state_transfer). Within 30 minutes, you should be able to: + +* Download the quickstart project and run the app. +* Follow this guide to explore the code. + +## Prerequisite + +Having a basic understanding of Akka actors will make it easier to understand the example. +If you are new to Akka, we recommend completing the +@extref[Akka Quickstart](akka-docs:typed/actors.html#first-example) before this tutorial. + +You can run the Akka HTTP example project on Linux, MacOS, or Windows. The only prerequisite is Java 17 or later, +and a local installation of [sbt](https://www.scala-sbt.org/download). + +## Downloading the example + +The Akka HTTP example for Scala is a zipped project that includes a sbt build file. Download and unzip the example as follows: + +1. Download the project [zip file](../attachments/akka-http-quickstart-scala.zip). +2. Extract the zip file to a convenient location. + +* On Linux and MacOS systems, open a terminal and use the command `unzip` akka-quickstart-scala.zip. +* On Windows, use a tool such as File Explorer to extract the project. + +Alternatively, you can bootstrap a new project with Akka HTTP already configured using the [Giter8](http://www.foundweekends.org/giter8/) template directly via sbt: + +```sh +sbt new akka/akka-http-quickstart-scala.g8 +``` + +## Running the example + +To run Hello World: + +In a console, change directories to the top level of the unzipped project. + +For example, if you used the default project name, `akka-http-quickstart`, and extracted the project to your root directory, from the root directory, enter: `cd akka-http-quickstart` + +Start sbt: + + * On OSX or Linux systems, enter `sbt` + * On Windows systems, enter `sbt.bat`. + +When you run sbt, it downloads project dependencies. The `>` prompt indicates that sbt is running in interactive mode. + +At the sbt prompt, enter `reStart`. + +sbt builds the project, starts an Akka HTTP server, and runs the example application. + +The output should look something like this: + +``` +[info] Loading global plugins from /Users/x/.sbt/0.13/plugins +... +[info] Running com.example.QuickstartServer +[2019-10-24 15:26:39,182] [INFO] [HelloAkkaHttpServer] [HelloAkkaHttpServer-akka.actor.default-dispatcher-3] [akka://HelloAkkaHttpServer/user/HttpServer] - Server online at http://127.0.0.1:8080/ +``` + +The Akka HTTP server is now running, and you can test it by sending simple HTTP requests. + +You can restart it by entering `reStart` again, and stop it with `reStop`. +To restart your application each time a change is detected, run `~reStart`. + +## Example app overview + +The user registry example contains functionality for adding, retrieving, or deleting a single user and for retrieving all users. Akka HTTP provides a [domain-specific language](https://en.wikipedia.org/wiki/Domain-specific_language) (DSL) to simplify the definition of endpoints as a `Route`. In this example, a `Route` defines: the paths `/users` and `/user`, the available HTTP methods, and when applicable, parameters or payloads. + +When the example app starts up, it creates an ActorSystem with a `UserRegistry` Actor and binds the defined routes to a port, in this case, `localhost:8080`. When the endpoints are invoked, they interact with the `UserRegistry` Actor, which contains the business logic. The diagram below illustrates runtime behavior, where that the HTTP server receives for the defined `route` endpoints, which are handled by the `UserRegistry` actor: + +![Architecture](images/hello-akka-http.png) + +## Exercising the example + +To get started, try registering and retrieving a few users. You simply need to know the appropriate parameters for the requests. In our example app, each user has a `name`, an `age`, and a `countryOfResidence`. + +You pass request parameters in JSON format. While you could do this in a browser, it is much simpler to use one of the following: + +* A command line tool, such as [cURL](https://en.wikipedia.org/wiki/CURL). +* Browser add-ons such as [RESTClient](http://restclient.net/) for Firefox or Postman for Chrome. + +Follow the steps appropriate for your tool: + +* [cURL commands](#cURL-commands) +* [Browser-based tools](#Browser-based-tools) + +### cURL commands + +Open a shell that supports cURL and follow these steps to add and retrieve users: + +Copy and paste the following lines to create a few users (enter one command at a time): + +``` +curl -H "Content-type: application/json" -X POST -d '{"name": "MrX", "age": 31, "countryOfResidence": "Canada"}' http://localhost:8080/users + +curl -H "Content-type: application/json" -X POST -d '{"name": "Anonymous", "age": 55, "countryOfResidence": "Iceland"}' http://localhost:8080/users + +curl -H "Content-type: application/json" -X POST -d '{"name": "Bill", "age": 67, "countryOfResidence": "USA"}' http://localhost:8080/users +``` + +The system should respond after each command to verify that the user was created. + +To retrieve all users, enter the following command: + +``` +curl http://localhost:8080/users +``` + +The system responds with the list of users: + +``` +{"users":[{"name":"Anonymous","age":55,"countryOfResidence":"Iceland"},{"name":"MrX","age":31,"countryOfResidence":"Canada"},{"name":"Bill","age":67,"countryOfResidence":"USA"}]} +``` + +To retrieve a specific user, enter the following command: + +``` +curl http://localhost:8080/users/Bill +``` + +The system should respond with the following: + +``` +{"name":"Bill","age":67,"countryOfResidence":"USA"} +``` + +Finally, it is possible to delete users: + +``` +curl -X DELETE http://localhost:8080/users/Bill +``` + +The response should be: + +``` +User Bill deleted. +``` + +### Browser-based clients + +Open a tool such as RESTClient or Postman and follow these steps to create and retrieve users: + +To create users: + +1. Select the `POST` method. +1. Enter the URL: `http://localhost:8080/users` +1. Set the Header to `Content-Type: application/json`. +1. In the body, copy and paste the following lines to create three users (send each payload separately). Note: for Postman, you might need to specify that you want to send `raw` data. + +``` +{"name": "MrX", "age": 31, "countryOfResidence": "Canada"} + +{"name": "Anonymous", "age": 55, "countryOfResidence": "Iceland"} + +{"name": "Bill", "age": 67, "countryOfResidence": "USA"} +``` + +The system should respond after each command to verify that the user was created. + +To retrieve all users: + +1. Select the `GET` method. +1. Enter the URL: `http://localhost:8080/users` +1. Send the request. + +The system should respond with a list of users in JSON format. + +## Learning from the example + +Congratulations, you just ran and exercised your first Akka HTTP app! You got a preview of how routes make it easy to communicate over HTTP. + +The example is implemented in the following four source files: + +* `QuickstartApp.scala` -- contains the main method which bootstraps the application +* `UserRoutes.scala` -- Akka HTTP `routes` defining exposed endpoints +* `UserRegistry.scala` -- the actor which handles the registration requests +* `JsonFormats.scala` -- converts the JSON data from requests into Scala types and from Scala types into JSON responses + +First, let's dissect the backend logic. + +@@@index + +* [The Actor backend](backend-actor.md) +* [The HTTP server](http-server.md) +* [JSON](json.md) +* [Running the application](running-the-application.md) +* [Testing Routes](testing-routes.md) + +@@@ diff --git a/docs/src/main/paradox/quickstart-scala/json.md b/docs/src/main/paradox/quickstart-scala/json.md new file mode 100644 index 00000000000..e356b985c63 --- /dev/null +++ b/docs/src/main/paradox/quickstart-scala/json.md @@ -0,0 +1,40 @@ +JSON marshalling +---------------- + +When exercising the app, you interacted with JSON payloads. How does the example app convert data between JSON format and data that can be used by Scala classes? The answer begins in the `JsonFormats` object: + +@@snip [JsonFormats.scala](/samples/akka-http-quickstart-scala/src/main/scala/com/example/JsonFormats.scala) { #json-formats } + +We're using the [Spray JSON](https://github.com/spray/spray-json) library here, which allows us to define json marshallers +(or `formats` which is what Spray JSON calls them) in a type-safe way. In other words, if we don't provide a format instance for +a type, yet we'd try to return it in a route by calling `complete(someValue)` the code would not compile - saying that +it does not know how to marshal the `SomeValue` type. This has the up-side of us being completely in control over what +we want to expose, and not exposing some type accidentally in our HTTP API. + +To handle the two different payloads, the trait defines two implicit values; `userJsonFormat` and `usersJsonFormat`. Defining the formatters as `implicit` ensures that the compiler can map the formatting functionality with the case classes to convert. + +The `jsonFormatX` methods come from Spray JSON. The `X` represents the number of parameters in the underlying case classes: + +@@snip [UserRegistry.scala](/samples/akka-http-quickstart-scala/src/main/scala/com/example/UserRegistry.scala) { #user-case-classes } + +We won't go into how the formatters are implemented - this is done for us by the library. All you need to remember for now is to define the formatters as implicit and that the formatter used should map the number of parameters belonging to the case class it converts. + +With these formatters defined, we can import them into the scope of the routes definition so that they are available where +we want to use them: + +@@snip [UserRoutes.scala](/samples/akka-http-quickstart-scala/src/main/scala/com/example/UserRoutes.scala) { #import-json-formats } + +@@@ note + +While we used Spray JSON in this example, various other libraries are supported via the [Akka HTTP JSON](https://github.com/hseeberger/akka-http-json) +project, including [Jackson](https://github.com/FasterXML/jackson), [Play JSON](https://www.playframework.com/documentation/2.6.x/ScalaJson) +or [circe](https://circe.github.io/circe/). + +Each library comes with different trade-offs in performance and user-friendlieness. Spray JSON is generally the fastest, though it requires you to write the format values explicitly. If you'd rather make "everything" automatically marshallable into JSON values you might want to use Jackson or Circe instead. + +If you're not sure, we recommend sticking to Spray JSON as it's the closest in philosophy to Akka HTTP - being explicit about all capabilities. + +@@@ + +Now that we've examined the example app thoroughly, let's test a few remaining use cases. + diff --git a/docs/src/main/paradox/quickstart-scala/running-the-application.md b/docs/src/main/paradox/quickstart-scala/running-the-application.md new file mode 100644 index 00000000000..311b937c2ea --- /dev/null +++ b/docs/src/main/paradox/quickstart-scala/running-the-application.md @@ -0,0 +1,32 @@ +Running the application +----------------------- + +When you ran the example for the first time, you were able to create and retrieve multiple users. Now that you understand how the example is implemented, let's confirm that the rest of the functionality works. We want to verify that: + +* If we try to retrieve users when none exist, we get an empty list. +* If we try to retrieve a specific user that doesn't exist, we get a HTTP 404 `The requested resource could not be found` response. +* We can delete users. + +To test this functionality, follow these steps. If you need reminders on starting the app or sending requests, refer to the @ref:[instructions](index.md#exercising-the-example) in the beginning. + +`1.` If the Akka HTTP server is still running, stop and restart it. +`2.` With no users registered, use your tool of choice to: +`3.` Retrieve a list of users. Hint: use the `GET` method and append `/users` to the URL. + +You should get back an empty list: `{"users":[]}` + +`4.` Try to retrieve a single user named `MrX`. Hint: use the `GET` method and append `users/MrX` to the URL. + +You should get back the message: `User MrX is not registered.` + +`5.` Try adding one or more users. Hint: use the `POST` method, append `/users` to the URL, and format the data in JSON, similar to: `{"name":"MrX","age":31,"countryOfResidence":"Canada"}` + +You should get back the message: `User MrX created.` + +`6.` Try deleting a user you just added. Hint: use the `DELETE`, and append `/users/` to the URL. + +You should get back the message: `User MrX deleted.` + +## Tutorial done! + +Congratulations! You can start building real-world applications that use Akka HTTP. Of course, we didn't have time to cover all Akka HTTP features in this short guide. See the @ref[documentation](../index.md) to learn more. diff --git a/docs/src/main/paradox/quickstart-scala/testing-routes.md b/docs/src/main/paradox/quickstart-scala/testing-routes.md new file mode 100644 index 00000000000..347a0154388 --- /dev/null +++ b/docs/src/main/paradox/quickstart-scala/testing-routes.md @@ -0,0 +1,106 @@ +Testing routes +-------------- + +If you remember when we started out with our `QuickstartApp`, we decided to put the routes themselves into a separate +class. Back there we said that we're doing this to separate the infrastructure code (setting up the actor system and +wiring up all the dependencies and actors), from the routes, which should only declare what they need to work with, +and can therefore be a bit more focused on their task at hand. This of course leads us to better testability. + +This separation, other than being a good idea on its own, was all for this moment! For when we want to write tests +to cover all our routes, without having to bring up the entire application. + +## Unit testing routes + +There are multiple ways one can test an HTTP application of course, however lets start at the simplest and also quickest +way: unit testing. In this style of testing, we won't even need to spin up an actual server - all the tests will be +executed on the routes directly - without the need of hitting actual network. This is due to Akka HTTP's pure design +and separation between the network layer (represented as a bi-directional `Flow` of byte strings to Http domain objects). + +In other words, unit testing in Akka HTTP is simply "executing" the routes by passing in an `HttpResponse` to the route, +and later inspecting what `HttpResponse` (or `rejection` if the request could not be handled) it resulted in. All this +in-memory, without having to start a real HTTP server - which gives us supreme speed and turn-over time when developing +an application using Akka. + +First we'll need to extend a number of base traits: + +@@snip [QuickstartServer.scala](/samples/akka-http-quickstart-scala/src/test/scala/com/example/UserRoutesSpec.scala) { #test-top } + +Here we're using ScalaTest which provides the testing *style* `WordSpec` and the `Matchers` trait which provides +the `something should === (somethingElse)` syntax [and more](http://www.scalatest.org/user_guide/using_matchers). +Next we inherit the Akka HTTP provided `ScalatestRouteTest` bridge trait that provides Route specific testing facilities, +and binds into ScalaTest's lifecycle methods such that the `ActorSystem` is started and stopped automatically for us. + + +@@@ note + +If you're using Specs2 instead, you can simply extend the `Specs2RouteTest` support trait instead. + +@@@ + + +Next we'll need to bring into the test class our routes that we want to test. We're doing this by creating an instance of the `UserRoutes` and importing the marshallers from `JsonFormats` into scope for the tests to use, as well as makes it possible to implement all abstract members of that trait in the test itself - all in in a fully type-safe way. + +We'll want to use the Akka `ActorTestKit` however the `ScalaRouteTest` only knows of the "classic" `ActorSystem` so we need +to provide a small adapter allowing us to combine both. + +Next we need to have a `ActorRef[UserRegistry.Command]` available that that our routes will interact with. We are using the actual actor since it does not have any dependencies, this makes the test more like an integration test than a unit test. For a more isolated test a `TestProbe` from the Akka Testkit could be used - it would allow us to verify the route indeed did send a message do the Actor or not and send specific responses back in each test case. + +@@snip [QuickstartServer.scala](/samples/akka-http-quickstart-scala/src/test/scala/com/example/UserRoutesSpec.scala) { #set-up } + +We could create an actor that replies with a mocked response here instead if we wanted to, this is especially useful if +the route awaits an response from the actor before rendering the `HttpResponse` to the client. Read about the @extref[Akka TestKit](akka-docs:testing.html) and it's utilities like `TestProbe` if this is something you'd like to learn more about. + +Let's write our first test, in which we'll hit the `/users` endpoint with a `GET` request: + +@@snip [QuickstartServer.scala](/samples/akka-http-quickstart-scala/src/test/scala/com/example/UserRoutesSpec.scala) { #actual-test } + +We simply construct a raw `HttpRequest` object and pass it into the route using the `~>` testing operator provided by `ScalatestRouteTest`. Next we do the same and pipe the result of that route into a check block, so the full syntax is: +`request ~> route ~> check { }`. This syntax allows us to not worry about the asynchronous nature of the request handling. +After all, the route is a function of `HttpRequest => Future[HttpResponse]` - here we don't need to explicitly write code +that's awaiting on the response, it's handled for us. + +Inside the check block we can inspect @ref[all kinds of attributes](../routing-dsl/testkit.md#table-of-inspectors) of the received response, like `status`, `contentType` and +of course the full response which we can easily convert to a string for testing using `responseAs[String]`. This infrastructure +is using the same marshalling infrastructure as our routes, so if the response was a `User` JSON, we could say `responseAs[User]` and write our assertions on the actual object. + +In the next test we'd like test a `POST` endpoint, so we need to send an entity to the endpoint in order to create a new `User`. This time, instead of using the raw `HttpRequest` to build the request we'll use a small DSL provided by the Akka HTTP. The DSL allows you to write `Post("/hello)` instead of having to declare the full thing in the raw API (which would have been: `HttpRequest(method = HttpMethods.POST, uri = "/hello")`), and next we'll add the User JSON into the request body: + +@@snip [QuickstartServer.scala](/samples/akka-http-quickstart-scala/src/test/scala/com/example/UserRoutesSpec.scala) { #testing-post } + +So in order to add the entity we've used the `Marshal(object).to[TargetType]` syntax, which uses the same marshalling +infrastructure that is used when we `complete(object)`. Since we extend the `UserRoutes` trait in this test, all the +necessary implicits for the marshalling to work this way are also present in scope of the test. This is another reason +why it's so convenient to extend the Routes trait when testing it - everything the actual code was using, we also have at +our disposal when writing the test. + +This concludes the basics of unit testing HTTP routes, to learn more please refer to the +[Akka HTTP TestKit documentation](). + +### Complete unit test code listing + +For reference, here's the entire unit test code: + +@@snip [QuickstartServer.scala](/samples/akka-http-quickstart-scala/src/test/scala/com/example/UserRoutesSpec.scala) { #user-routes-spec } + + +## A note Integration testing routes + +While definitions of "what a pure unit-test is" are sometimes a subject of fierce debates in programming communities, +we refer to the above testing style as "route unit testing" since it's light weight and allows to test the routes in +isolation, especially if their dependencies would be mocked our with test stubs, instead of hitting real APIs. + +Sometimes however one wants to test the complete "full application", including starting a real HTTP server + +@@@ warning + + Some network specific features like timeouts, behaviour of entities (streamed directly from the network, instead of + in memory objects like in the unit testing style) may behave differently in the unit-testing style showcased above. + + If you want to test specific timing and entity draining behaviours of your apps you may want to add full integration tests for them. For most routes this should not be needed, however we'd recommend doing so when using more of the streaming features of Akka HTTP. + +@@@ + +Usually such tests would be implemented by starting the application the same way as we started it in the `QuickstartServer`, +in `beforeAll` (in ScalaTest), then hitting the API with http requests using the HTTP Client and asserting on the responses, +finally shutting down the server in `afterAll` (in ScalaTest). + diff --git a/docs/src/main/paradox/reference.md b/docs/src/main/paradox/reference.md index 0976f0526f1..cfa2a7b6ce9 100644 --- a/docs/src/main/paradox/reference.md +++ b/docs/src/main/paradox/reference.md @@ -1,4 +1,4 @@ -# 10. Reference +# 11. Reference ## API Documentation diff --git a/docs/src/main/paradox/release-notes/index.md b/docs/src/main/paradox/release-notes/index.md index efd953cf9f5..499060d374f 100644 --- a/docs/src/main/paradox/release-notes/index.md +++ b/docs/src/main/paradox/release-notes/index.md @@ -1,4 +1,4 @@ -# 11. Release Notes +# 12. Release Notes @@toc { depth=2 } diff --git a/docs/src/main/paradox/routing-dsl/index.md b/docs/src/main/paradox/routing-dsl/index.md index 7900888fcd0..37e9fdfda98 100644 --- a/docs/src/main/paradox/routing-dsl/index.md +++ b/docs/src/main/paradox/routing-dsl/index.md @@ -55,7 +55,7 @@ the Routing DSL will look like: ## Getting started -The project template in @scala[[Akka HTTP Quickstart for Scala](https://developer.lightbend.com/guides/akka-http-quickstart-scala/)]@java[[Akka HTTP Quickstart for Java](https://developer.lightbend.com/guides/akka-http-quickstart-java/)] will help you to get a working Akka HTTP server running. +The project template in @scala[@ref[Akka HTTP Quickstart for Scala](../quickstart-scala/index.md)]@java[@ef[Akka HTTP Quickstart for Java](../quickstart-java/index.md)] will help you to get a working Akka HTTP server running. ## Compared with Play framework routes diff --git a/samples/akka-http-quickstart-java/README.md b/samples/akka-http-quickstart-java/README.md new file mode 100644 index 00000000000..b2c1b1fd3cf --- /dev/null +++ b/samples/akka-http-quickstart-java/README.md @@ -0,0 +1,34 @@ +# Sample Akka HTTP server + +This is a sample Akka HTTP endpoint keeping an in-memory database of users that can be created and listed. + +Sources in the sample: + +* `QuickstartApp.java` -- contains the main method which bootstraps the application +* `UserRoutes.java` -- Akka HTTP `routes` defining exposed endpoints +* `UserRegistry.java` -- the actor which handles the registration requests + +## Interacting with the sample + +Start the sample: +``` +mvn compile exec:exec +``` + +The following requests can be made: + +List all users: + + curl http://localhost:8080/users + +Create a user: + + curl -XPOST http://localhost:8080/users -d '{"name": "Liselott", "age": 32, "countryOfResidence": "Norway"}' -H "Content-Type:application/json" + +Get the details of one user: + + curl http://localhost:8080/users/Liselott + +Delete a user: + + curl -XDELETE http://localhost:8080/users/Liselott diff --git a/samples/akka-http-quickstart-java/pom.xml b/samples/akka-http-quickstart-java/pom.xml new file mode 100644 index 00000000000..d953a860623 --- /dev/null +++ b/samples/akka-http-quickstart-java/pom.xml @@ -0,0 +1,104 @@ + + + 4.0.0 + + com.example + akka-http-seed-java + 1.0 + + + 2.9.2 + 10.6.2 + 2.13 + UTF-8 + + + + + akka-repository + Akka library repository + https://repo.akka.io/maven + + + + + + + com.typesafe.akka + akka-http-bom_${scala.binary.version} + ${akka-http.version} + pom + import + + + + + + + com.typesafe.akka + akka-http_${scala.binary.version} + + + com.typesafe.akka + akka-actor-typed_${scala.binary.version} + ${akka.version} + + + com.typesafe.akka + akka-stream_${scala.binary.version} + ${akka.version} + + + com.typesafe.akka + akka-http-jackson_${scala.binary.version} + + + ch.qos.logback + logback-classic + 1.2.13 + + + com.typesafe.akka + akka-http-testkit_${scala.binary.version} + test + + + com.typesafe.akka + akka-actor-testkit-typed_${scala.binary.version} + ${akka.version} + test + + + junit + junit + 4.13.2 + test + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.5.1 + + 17 + 17 + + + + org.codehaus.mojo + exec-maven-plugin + 3.0.0 + + java + + -classpath + + com.example.QuickstartApp + + + + + + diff --git a/samples/akka-http-quickstart-java/src/main/java/com/example/QuickstartApp.java b/samples/akka-http-quickstart-java/src/main/java/com/example/QuickstartApp.java new file mode 100644 index 00000000000..ac1187eea56 --- /dev/null +++ b/samples/akka-http-quickstart-java/src/main/java/com/example/QuickstartApp.java @@ -0,0 +1,62 @@ +package com.example; + +import akka.NotUsed; +import akka.actor.typed.ActorRef; +import akka.actor.typed.Behavior; +import akka.http.javadsl.ConnectHttp; +import akka.http.javadsl.Http; +import akka.http.javadsl.ServerBinding; +import akka.http.javadsl.model.HttpRequest; +import akka.http.javadsl.model.HttpResponse; +import akka.http.javadsl.server.Route; +import akka.stream.Materializer; +import akka.stream.javadsl.Flow; +import akka.actor.typed.javadsl.Adapter; +import akka.actor.typed.javadsl.Behaviors; +import akka.actor.typed.ActorSystem; + +import java.net.InetSocketAddress; +import java.util.concurrent.CompletionStage; + +//#main-class +public class QuickstartApp { + // #start-http-server + static void startHttpServer(Route route, ActorSystem system) { + CompletionStage futureBinding = + Http.get(system).newServerAt("localhost", 8080).bind(route); + + futureBinding.whenComplete((binding, exception) -> { + if (binding != null) { + InetSocketAddress address = binding.localAddress(); + system.log().info("Server online at http://{}:{}/", + address.getHostString(), + address.getPort()); + } else { + system.log().error("Failed to bind HTTP endpoint, terminating system", exception); + system.terminate(); + } + }); + } + // #start-http-server + + public static void main(String[] args) throws Exception { + //#server-bootstrapping + Behavior rootBehavior = Behaviors.setup(context -> { + ActorRef userRegistryActor = + context.spawn(UserRegistry.create(), "UserRegistry"); + + UserRoutes userRoutes = new UserRoutes(context.getSystem(), userRegistryActor); + startHttpServer(userRoutes.userRoutes(), context.getSystem()); + + return Behaviors.empty(); + }); + + // boot up server using the route as defined below + ActorSystem.create(rootBehavior, "HelloAkkaHttpServer"); + //#server-bootstrapping + } + +} +//#main-class + + diff --git a/samples/akka-http-quickstart-java/src/main/java/com/example/UserRegistry.java b/samples/akka-http-quickstart-java/src/main/java/com/example/UserRegistry.java new file mode 100644 index 00000000000..b373a52fec4 --- /dev/null +++ b/samples/akka-http-quickstart-java/src/main/java/com/example/UserRegistry.java @@ -0,0 +1,88 @@ +package com.example; + +import akka.actor.typed.ActorRef; +import akka.actor.typed.Behavior; +import akka.actor.typed.javadsl.AbstractBehavior; +import akka.actor.typed.javadsl.ActorContext; +import akka.actor.typed.javadsl.Behaviors; +import akka.actor.typed.javadsl.Receive; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.*; + +//#user-registry-actor +public class UserRegistry extends AbstractBehavior { + + // actor protocol + sealed interface Command {} + + public final static record GetUsers(ActorRef replyTo) implements Command {} + + public final static record CreateUser(User user, ActorRef replyTo) implements Command {} + + public final static record GetUserResponse(Optional maybeUser) {} + + public final static record GetUser(String name, ActorRef replyTo) implements Command {} + + + public final static record DeleteUser(String name, ActorRef replyTo) implements Command {} + + + public final static record ActionPerformed(String description) implements Command {} + + //#user-case-classes + public final static record User(String name, int age, String countryOfResidence) {} + + public final static record Users(List users) {} + //#user-case-classes + + private final List users = new ArrayList<>(); + + private UserRegistry(ActorContext context) { + super(context); + } + + public static Behavior create() { + return Behaviors.setup(UserRegistry::new); + } + + @Override + public Receive createReceive() { + return newReceiveBuilder() + .onMessage(GetUsers.class, this::onGetUsers) + .onMessage(CreateUser.class, this::onCreateUser) + .onMessage(GetUser.class, this::onGetUser) + .onMessage(DeleteUser.class, this::onDeleteUser) + .build(); + } + + private Behavior onGetUsers(GetUsers command) { + // We must be careful not to send out users since it is mutable + // so for this response we need to make a defensive copy + command.replyTo().tell(new Users(Collections.unmodifiableList(new ArrayList<>(users)))); + return this; + } + + private Behavior onCreateUser(CreateUser command) { + users.add(command.user()); + command.replyTo().tell(new ActionPerformed(String.format("User %s created.", command.user().name()))); + return this; + } + + private Behavior onGetUser(GetUser command) { + Optional maybeUser = users.stream() + .filter(user -> user.name().equals(command.name())) + .findFirst(); + command.replyTo().tell(new GetUserResponse(maybeUser)); + return this; + } + + private Behavior onDeleteUser(DeleteUser command) { + users.removeIf(user -> user.name().equals(command.name())); + command.replyTo().tell(new ActionPerformed(String.format("User %s deleted.", command.name))); + return this; + } + +} +//#user-registry-actor diff --git a/samples/akka-http-quickstart-java/src/main/java/com/example/UserRoutes.java b/samples/akka-http-quickstart-java/src/main/java/com/example/UserRoutes.java new file mode 100644 index 00000000000..6eea10f3889 --- /dev/null +++ b/samples/akka-http-quickstart-java/src/main/java/com/example/UserRoutes.java @@ -0,0 +1,112 @@ +package com.example; + +import java.time.Duration; +import java.util.Optional; +import java.util.concurrent.CompletionStage; + +import com.example.UserRegistry.User; +import akka.actor.typed.ActorRef; +import akka.actor.typed.ActorSystem; +import akka.actor.typed.Scheduler; +import akka.actor.typed.javadsl.AskPattern; +import akka.http.javadsl.marshallers.jackson.Jackson; + +import static akka.http.javadsl.server.Directives.*; + +import akka.http.javadsl.model.StatusCodes; +import akka.http.javadsl.server.PathMatchers; +import akka.http.javadsl.server.Route; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Routes can be defined in separated classes like shown in here + */ +//#user-routes-class +public class UserRoutes { + //#user-routes-class + private final static Logger log = LoggerFactory.getLogger(UserRoutes.class); + private final ActorRef userRegistryActor; + private final Duration askTimeout; + private final Scheduler scheduler; + + public UserRoutes(ActorSystem system, ActorRef userRegistryActor) { + this.userRegistryActor = userRegistryActor; + scheduler = system.scheduler(); + askTimeout = system.settings().config().getDuration("my-app.routes.ask-timeout"); + } + + private CompletionStage getUser(String name) { + return AskPattern.ask(userRegistryActor, ref -> new UserRegistry.GetUser(name, ref), askTimeout, scheduler); + } + + private CompletionStage deleteUser(String name) { + return AskPattern.ask(userRegistryActor, ref -> new UserRegistry.DeleteUser(name, ref), askTimeout, scheduler); + } + + private CompletionStage getUsers() { + return AskPattern.ask(userRegistryActor, UserRegistry.GetUsers::new, askTimeout, scheduler); + } + + private CompletionStage createUser(User user) { + return AskPattern.ask(userRegistryActor, ref -> new UserRegistry.CreateUser(user, ref), askTimeout, scheduler); + } + + /** + * This method creates one route (of possibly many more that will be part of your Web App) + */ + //#all-routes + public Route userRoutes() { + return pathPrefix("users", () -> + concat( + //#users-get-delete + pathEnd(() -> + concat( + get(() -> + onSuccess(getUsers(), + users -> complete(StatusCodes.OK, users, Jackson.marshaller()) + ) + ), + post(() -> + entity( + Jackson.unmarshaller(User.class), + user -> + onSuccess(createUser(user), performed -> { + log.info("Create result: {}", performed.description()); + return complete(StatusCodes.CREATED, performed, Jackson.marshaller()); + }) + ) + ) + ) + ), + //#users-get-delete + //#users-get-post + path(PathMatchers.segment(), (String name) -> + concat( + get(() -> + //#retrieve-user-info + rejectEmptyResponse(() -> + onSuccess(getUser(name), performed -> + complete(StatusCodes.OK, performed.maybeUser(), Jackson.marshaller()) + ) + ) + //#retrieve-user-info + ), + delete(() -> + //#users-delete-logic + onSuccess(deleteUser(name), performed -> { + log.info("Delete result: {}", performed.description()); + return complete(StatusCodes.OK, performed, Jackson.marshaller()); + } + ) + //#users-delete-logic + ) + ) + ) + //#users-get-post + ) + ); + } + //#all-routes + +} diff --git a/samples/akka-http-quickstart-java/src/main/resources/application.conf b/samples/akka-http-quickstart-java/src/main/resources/application.conf new file mode 100644 index 00000000000..acd17dfa4c7 --- /dev/null +++ b/samples/akka-http-quickstart-java/src/main/resources/application.conf @@ -0,0 +1,6 @@ +my-app { + routes { + # If ask takes more time than this to complete the request is failed + ask-timeout = 5s + } +} diff --git a/samples/akka-http-quickstart-java/src/main/resources/logback.xml b/samples/akka-http-quickstart-java/src/main/resources/logback.xml new file mode 100644 index 00000000000..b1fe9ae92b2 --- /dev/null +++ b/samples/akka-http-quickstart-java/src/main/resources/logback.xml @@ -0,0 +1,20 @@ + + + + + [%date{ISO8601}] [%level] [%logger] [%thread] [%X{akkaSource}] - %msg%n + + + + + 1024 + true + + + + + + + + diff --git a/samples/akka-http-quickstart-java/src/test/java/com/example/UserRoutesTest.java b/samples/akka-http-quickstart-java/src/test/java/com/example/UserRoutesTest.java new file mode 100644 index 00000000000..02896cae401 --- /dev/null +++ b/samples/akka-http-quickstart-java/src/test/java/com/example/UserRoutesTest.java @@ -0,0 +1,77 @@ +package com.example; + + +//#test-top +import akka.actor.typed.ActorRef; +import akka.http.javadsl.model.*; +import akka.http.javadsl.testkit.JUnitRouteTest; +import akka.http.javadsl.testkit.TestRoute; +import org.junit.*; +import org.junit.runners.MethodSorters; +import akka.http.javadsl.model.HttpRequest; +import akka.http.javadsl.model.StatusCodes; +import akka.actor.testkit.typed.javadsl.TestKitJunitResource; + + +//#set-up +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +public class UserRoutesTest extends JUnitRouteTest { + + @ClassRule + public static TestKitJunitResource testkit = new TestKitJunitResource(); + + //#test-top + // shared registry for all tests + private static ActorRef userRegistry; + private TestRoute appRoute; + + @BeforeClass + public static void beforeClass() { + userRegistry = testkit.spawn(UserRegistry.create()); + } + + @Before + public void before() { + UserRoutes userRoutes = new UserRoutes(testkit.system(), userRegistry); + appRoute = testRoute(userRoutes.userRoutes()); + } + + @AfterClass + public static void afterClass() { + testkit.stop(userRegistry); + } + + //#set-up + //#actual-test + @Test + public void test1NoUsers() { + appRoute.run(HttpRequest.GET("/users")) + .assertStatusCode(StatusCodes.OK) + .assertMediaType("application/json") + .assertEntity("{\"users\":[]}"); + } + + //#actual-test + //#testing-post + @Test + public void test2HandlePOST() { + appRoute.run(HttpRequest.POST("/users") + .withEntity(MediaTypes.APPLICATION_JSON.toContentType(), + "{\"name\": \"Kapi\", \"age\": 42, \"countryOfResidence\": \"jp\"}")) + .assertStatusCode(StatusCodes.CREATED) + .assertMediaType("application/json") + .assertEntity("{\"description\":\"User Kapi created.\"}"); + } + //#testing-post + + @Test + public void test3Remove() { + appRoute.run(HttpRequest.DELETE("/users/Kapi")) + .assertStatusCode(StatusCodes.OK) + .assertMediaType("application/json") + .assertEntity("{\"description\":\"User Kapi deleted.\"}"); + + } + //#set-up +} +//#set-up diff --git a/samples/akka-http-quickstart-java/src/test/resources/application-test.conf b/samples/akka-http-quickstart-java/src/test/resources/application-test.conf new file mode 100644 index 00000000000..7f7633243de --- /dev/null +++ b/samples/akka-http-quickstart-java/src/test/resources/application-test.conf @@ -0,0 +1,3 @@ +include "application" + +# default config for tests, we just import the regular conf \ No newline at end of file diff --git a/samples/akka-http-quickstart-scala/README.md b/samples/akka-http-quickstart-scala/README.md new file mode 100644 index 00000000000..2fd47151bce --- /dev/null +++ b/samples/akka-http-quickstart-scala/README.md @@ -0,0 +1,30 @@ +# Sample Akka HTTP server + +This is a sample Akka HTTP endpoint keeping an in-memory database of users that can be created and listed. + +Sources in the sample: + +* `QuickstartApp.scala` -- contains the main method which bootstraps the application +* `UserRoutes.scala` -- Akka HTTP `routes` defining exposed endpoints +* `UserRegistry.scala` -- the actor which handles the registration requests +* `JsonFormats.scala` -- converts the JSON data from requests into Scala types and from Scala types into JSON responses + +## Interacting with the sample + +After starting the sample with `sbt run` the following requests can be made: + +List all users: + + curl http://localhost:8080/users + +Create a user: + + curl -XPOST http://localhost:8080/users -d '{"name": "Liselott", "age": 32, "countryOfResidence": "Norway"}' -H "Content-Type:application/json" + +Get the details of one user: + + curl http://localhost:8080/users/Liselott + +Delete a user: + + curl -XDELETE http://localhost:8080/users/Liselott \ No newline at end of file diff --git a/samples/akka-http-quickstart-scala/build.sbt b/samples/akka-http-quickstart-scala/build.sbt new file mode 100644 index 00000000000..4b1d8cd2e23 --- /dev/null +++ b/samples/akka-http-quickstart-scala/build.sbt @@ -0,0 +1,30 @@ +lazy val akkaHttpVersion = sys.props.getOrElse("akka-http.version", "10.6.2") +lazy val akkaVersion = "2.9.2" + +resolvers += "Akka library repository".at("https://repo.akka.io/maven") + +// Run in a separate JVM, to make sure sbt waits until all threads have +// finished before returning. +// If you want to keep the application running while executing other +// sbt tasks, consider https://github.com/spray/sbt-revolver/ +fork := true + +lazy val root = (project in file(".")). + settings( + inThisBuild(List( + organization := "com.example", + scalaVersion := "2.13.13" + )), + name := "akka-http-quickstart", + libraryDependencies ++= Seq( + "com.typesafe.akka" %% "akka-http" % akkaHttpVersion, + "com.typesafe.akka" %% "akka-http-spray-json" % akkaHttpVersion, + "com.typesafe.akka" %% "akka-actor-typed" % akkaVersion, + "com.typesafe.akka" %% "akka-stream" % akkaVersion, + "ch.qos.logback" % "logback-classic" % "1.2.11", + + "com.typesafe.akka" %% "akka-http-testkit" % akkaHttpVersion % Test, + "com.typesafe.akka" %% "akka-actor-testkit-typed" % akkaVersion % Test, + "org.scalatest" %% "scalatest" % "3.2.12" % Test + ) + ) diff --git a/samples/akka-http-quickstart-scala/project/build.properties b/samples/akka-http-quickstart-scala/project/build.properties new file mode 100644 index 00000000000..30409871515 --- /dev/null +++ b/samples/akka-http-quickstart-scala/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.9.4 diff --git a/samples/akka-http-quickstart-scala/project/plugins.sbt b/samples/akka-http-quickstart-scala/project/plugins.sbt new file mode 100644 index 00000000000..59cd318690a --- /dev/null +++ b/samples/akka-http-quickstart-scala/project/plugins.sbt @@ -0,0 +1 @@ +addSbtPlugin("io.spray" % "sbt-revolver" % "0.10.0") diff --git a/samples/akka-http-quickstart-scala/src/main/resources/application.conf b/samples/akka-http-quickstart-scala/src/main/resources/application.conf new file mode 100644 index 00000000000..acd17dfa4c7 --- /dev/null +++ b/samples/akka-http-quickstart-scala/src/main/resources/application.conf @@ -0,0 +1,6 @@ +my-app { + routes { + # If ask takes more time than this to complete the request is failed + ask-timeout = 5s + } +} diff --git a/samples/akka-http-quickstart-scala/src/main/resources/logback.xml b/samples/akka-http-quickstart-scala/src/main/resources/logback.xml new file mode 100644 index 00000000000..210d7b4a19d --- /dev/null +++ b/samples/akka-http-quickstart-scala/src/main/resources/logback.xml @@ -0,0 +1,20 @@ + + + + + [%date{ISO8601}] [%level] [%logger] [%thread] [%X{akkaSource}] - %msg%n + + + + + 1024 + true + + + + + + + + diff --git a/samples/akka-http-quickstart-scala/src/main/scala/com/example/JsonFormats.scala b/samples/akka-http-quickstart-scala/src/main/scala/com/example/JsonFormats.scala new file mode 100644 index 00000000000..8fc1f2931f8 --- /dev/null +++ b/samples/akka-http-quickstart-scala/src/main/scala/com/example/JsonFormats.scala @@ -0,0 +1,18 @@ +package com.example + +import com.example.UserRegistry.ActionPerformed + +//#json-formats +import spray.json.RootJsonFormat +import spray.json.DefaultJsonProtocol + +object JsonFormats { + // import the default encoders for primitive types (Int, String, Lists etc) + import DefaultJsonProtocol._ + + implicit val userJsonFormat: RootJsonFormat[User] = jsonFormat3(User.apply) + implicit val usersJsonFormat: RootJsonFormat[Users] = jsonFormat1(Users.apply) + + implicit val actionPerformedJsonFormat: RootJsonFormat[ActionPerformed] = jsonFormat1(ActionPerformed.apply) +} +//#json-formats diff --git a/samples/akka-http-quickstart-scala/src/main/scala/com/example/QuickstartApp.scala b/samples/akka-http-quickstart-scala/src/main/scala/com/example/QuickstartApp.scala new file mode 100644 index 00000000000..59d4343b98c --- /dev/null +++ b/samples/akka-http-quickstart-scala/src/main/scala/com/example/QuickstartApp.scala @@ -0,0 +1,44 @@ +package com.example + +import akka.actor.typed.ActorSystem +import akka.actor.typed.scaladsl.Behaviors +import akka.http.scaladsl.Http +import akka.http.scaladsl.server.Route + +import scala.util.Failure +import scala.util.Success + +//#main-class +object QuickstartApp { + //#start-http-server + private def startHttpServer(routes: Route)(implicit system: ActorSystem[_]): Unit = { + // Akka HTTP still needs a classic ActorSystem to start + import system.executionContext + + val futureBinding = Http().newServerAt("localhost", 8080).bind(routes) + futureBinding.onComplete { + case Success(binding) => + val address = binding.localAddress + system.log.info("Server online at http://{}:{}/", address.getHostString, address.getPort) + case Failure(ex) => + system.log.error("Failed to bind HTTP endpoint, terminating system", ex) + system.terminate() + } + } + //#start-http-server + def main(args: Array[String]): Unit = { + //#server-bootstrapping + val rootBehavior = Behaviors.setup[Nothing] { context => + val userRegistryActor = context.spawn(UserRegistry(), "UserRegistryActor") + context.watch(userRegistryActor) + + val routes = new UserRoutes(userRegistryActor)(context.system) + startHttpServer(routes.userRoutes)(context.system) + + Behaviors.empty + } + val system = ActorSystem[Nothing](rootBehavior, "HelloAkkaHttpServer") + //#server-bootstrapping + } +} +//#main-class diff --git a/samples/akka-http-quickstart-scala/src/main/scala/com/example/UserRegistry.scala b/samples/akka-http-quickstart-scala/src/main/scala/com/example/UserRegistry.scala new file mode 100644 index 00000000000..07662ba431b --- /dev/null +++ b/samples/akka-http-quickstart-scala/src/main/scala/com/example/UserRegistry.scala @@ -0,0 +1,43 @@ +package com.example + +//#user-registry-actor +import akka.actor.typed.ActorRef +import akka.actor.typed.Behavior +import akka.actor.typed.scaladsl.Behaviors +import scala.collection.immutable + +//#user-case-classes +final case class User(name: String, age: Int, countryOfResidence: String) +final case class Users(users: immutable.Seq[User]) +//#user-case-classes + +object UserRegistry { + // actor protocol + sealed trait Command + final case class GetUsers(replyTo: ActorRef[Users]) extends Command + final case class CreateUser(user: User, replyTo: ActorRef[ActionPerformed]) extends Command + final case class GetUser(name: String, replyTo: ActorRef[GetUserResponse]) extends Command + final case class DeleteUser(name: String, replyTo: ActorRef[ActionPerformed]) extends Command + + final case class GetUserResponse(maybeUser: Option[User]) + final case class ActionPerformed(description: String) + + def apply(): Behavior[Command] = registry(Set.empty) + + private def registry(users: Set[User]): Behavior[Command] = + Behaviors.receiveMessage { + case GetUsers(replyTo) => + replyTo ! Users(users.toSeq) + Behaviors.same + case CreateUser(user, replyTo) => + replyTo ! ActionPerformed(s"User ${user.name} created.") + registry(users + user) + case GetUser(name, replyTo) => + replyTo ! GetUserResponse(users.find(_.name == name)) + Behaviors.same + case DeleteUser(name, replyTo) => + replyTo ! ActionPerformed(s"User $name deleted.") + registry(users.filterNot(_.name == name)) + } +} +//#user-registry-actor diff --git a/samples/akka-http-quickstart-scala/src/main/scala/com/example/UserRoutes.scala b/samples/akka-http-quickstart-scala/src/main/scala/com/example/UserRoutes.scala new file mode 100644 index 00000000000..df5d9feb055 --- /dev/null +++ b/samples/akka-http-quickstart-scala/src/main/scala/com/example/UserRoutes.scala @@ -0,0 +1,79 @@ +package com.example + +import akka.http.scaladsl.server.Directives._ +import akka.http.scaladsl.model.StatusCodes +import akka.http.scaladsl.server.Route + +import scala.concurrent.Future +import com.example.UserRegistry._ +import akka.actor.typed.ActorRef +import akka.actor.typed.ActorSystem +import akka.actor.typed.scaladsl.AskPattern._ +import akka.util.Timeout + +//#import-json-formats +//#user-routes-class +class UserRoutes(userRegistry: ActorRef[UserRegistry.Command])(implicit val system: ActorSystem[_]) { + + //#user-routes-class + import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport._ + import JsonFormats._ + //#import-json-formats + + // If ask takes more time than this to complete the request is failed + private implicit val timeout: Timeout = Timeout.create(system.settings.config.getDuration("my-app.routes.ask-timeout")) + + def getUsers(): Future[Users] = + userRegistry.ask(GetUsers.apply) + def getUser(name: String): Future[GetUserResponse] = + userRegistry.ask(GetUser(name, _)) + def createUser(user: User): Future[ActionPerformed] = + userRegistry.ask(CreateUser(user, _)) + def deleteUser(name: String): Future[ActionPerformed] = + userRegistry.ask(DeleteUser(name, _)) + + //#all-routes + //#users-get-post + //#users-get-delete + val userRoutes: Route = + pathPrefix("users") { + concat( + //#users-get-delete + pathEnd { + concat( + get { + complete(getUsers()) + }, + post { + entity(as[User]) { user => + onSuccess(createUser(user)) { performed => + complete((StatusCodes.Created, performed)) + } + } + }) + }, + //#users-get-delete + //#users-get-post + path(Segment) { name => + concat( + get { + //#retrieve-user-info + rejectEmptyResponse { + onSuccess(getUser(name)) { response => + complete(response.maybeUser) + } + } + //#retrieve-user-info + }, + delete { + //#users-delete-logic + onSuccess(deleteUser(name)) { performed => + complete((StatusCodes.OK, performed)) + } + //#users-delete-logic + }) + }) + //#users-get-delete + } + //#all-routes +} diff --git a/samples/akka-http-quickstart-scala/src/test/resources/application-test.conf b/samples/akka-http-quickstart-scala/src/test/resources/application-test.conf new file mode 100644 index 00000000000..7f7633243de --- /dev/null +++ b/samples/akka-http-quickstart-scala/src/test/resources/application-test.conf @@ -0,0 +1,3 @@ +include "application" + +# default config for tests, we just import the regular conf \ No newline at end of file diff --git a/samples/akka-http-quickstart-scala/src/test/scala/com/example/UserRoutesSpec.scala b/samples/akka-http-quickstart-scala/src/test/scala/com/example/UserRoutesSpec.scala new file mode 100644 index 00000000000..be5f33c385c --- /dev/null +++ b/samples/akka-http-quickstart-scala/src/test/scala/com/example/UserRoutesSpec.scala @@ -0,0 +1,96 @@ +package com.example + +//#user-routes-spec +//#test-top +import akka.actor.testkit.typed.scaladsl.ActorTestKit +import akka.actor.typed.ActorSystem +import akka.http.scaladsl.marshalling.Marshal +import akka.http.scaladsl.model._ +import akka.http.scaladsl.testkit.ScalatestRouteTest +import org.scalatest.concurrent.ScalaFutures +import org.scalatest.matchers.should.Matchers +import org.scalatest.wordspec.AnyWordSpec + +//#set-up +class UserRoutesSpec extends AnyWordSpec with Matchers with ScalaFutures with ScalatestRouteTest { + //#test-top + + // the Akka HTTP route testkit does not yet support a typed actor system (https://github.com/akka/akka-http/issues/2036) + // so we have to adapt for now + lazy val testKit = ActorTestKit() + implicit def typedSystem: ActorSystem[_] = testKit.system + override def createActorSystem(): akka.actor.ActorSystem = + testKit.system.classicSystem + + // Here we need to implement all the abstract members of UserRoutes. + // We use the real UserRegistryActor to test it while we hit the Routes, + // but we could "mock" it by implementing it in-place or by using a TestProbe + // created with testKit.createTestProbe() + val userRegistry = testKit.spawn(UserRegistry()) + lazy val routes = new UserRoutes(userRegistry).userRoutes + + // use the json formats to marshal and unmarshall objects in the test + import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport._ + import JsonFormats._ + //#set-up + + //#actual-test + "UserRoutes" should { + "return no users if no present (GET /users)" in { + // note that there's no need for the host part in the uri: + val request = HttpRequest(uri = "/users") + + request ~> routes ~> check { + status should ===(StatusCodes.OK) + + // we expect the response to be json: + contentType should ===(ContentTypes.`application/json`) + + // and no entries should be in the list: + entityAs[String] should ===("""{"users":[]}""") + } + } + //#actual-test + + //#testing-post + "be able to add users (POST /users)" in { + val user = User("Kapi", 42, "jp") + val userEntity = Marshal(user).to[MessageEntity].futureValue // futureValue is from ScalaFutures + + // using the RequestBuilding DSL: + val request = Post("/users").withEntity(userEntity) + + request ~> routes ~> check { + status should ===(StatusCodes.Created) + + // we expect the response to be json: + contentType should ===(ContentTypes.`application/json`) + + // and we know what message we're expecting back: + entityAs[String] should ===("""{"description":"User Kapi created."}""") + } + } + //#testing-post + + "be able to remove users (DELETE /users)" in { + // user the RequestBuilding DSL provided by ScalatestRouteSpec: + val request = Delete(uri = "/users/Kapi") + + request ~> routes ~> check { + status should ===(StatusCodes.OK) + + // we expect the response to be json: + contentType should ===(ContentTypes.`application/json`) + + // and no entries should be in the list: + entityAs[String] should ===("""{"description":"User Kapi deleted."}""") + } + } + //#actual-test + } + //#actual-test + + //#set-up +} +//#set-up +//#user-routes-spec diff --git a/scripts/prepare-downloads.sh b/scripts/prepare-downloads.sh new file mode 100755 index 00000000000..e3e2933e4e0 --- /dev/null +++ b/scripts/prepare-downloads.sh @@ -0,0 +1,73 @@ +#!/usr/bin/env bash + +set -e + +declare -r samples_sources="${PWD}/samples" +declare -r docs_attachments="${PWD}/docs/src/main/paradox/attachments" +declare -r target_temporal_attachments="${PWD}/target/docs/_attachments" + +declare -r temporal_folder="${PWD}/target/zips" + +function sed_command() { + local platform="$(uname -s | tr '[:upper:]' '[:lower:]')" + + if [ "${platform}" != "darwin" ]; then + echo "sed" + else + # using gnu-sed on Mac + echo "gsed" + fi +} + +## Remove the tags used by Paradox snippets from the codebase in the current folder +function removeTags() { + ## remove tags from code + find . -type f -print0 | xargs -0 $(sed_command) -i "s/\/\/ #.*//g" +} + + +## Cleanup the temporal folder from previous executions +function prepareTemporalFolder() { + rm -rf ${temporal_folder} + mkdir -p ${temporal_folder} +} + +## Copy a folder with some code into the temporal folder. The +## copied folder will be renamed to the folder name we want the +## user to see when unzipping the file. +## source_name -> folder in `examples` +## target_name -> folder name the user should see (must not use a numeric prefix of a laguage suffix) +function fetchProject() { + source_name=$1 + target_name=$2 + echo "Fetching content from [$1] to [$2]" + cp -a ${source_name} ${temporal_folder}/${target_name} + rm -rf ${temporal_folder}/${target_name}/target +} + +## Zip the contents in $temporal_folder and create the +## attachment file (aka, the zip file on the appropriate location) +function zipAndAttach() { + zip_name=$1 + temporal_attachments=$2 + echo "Preparing zip $1" + pushd ${temporal_folder} + removeTags + zip --quiet -r ${zip_name} * + cp ${zip_name} ${temporal_attachments} + echo "Prepared attachment at ${zip_name}" + popd +} + +mkdir -p ${docs_attachments} +mkdir -p ${target_temporal_attachments} + +## akka-http-quickstart-java zip file +prepareTemporalFolder +fetchProject ${samples_sources}/akka-http-quickstart-java akka-http-quickstart +zipAndAttach ${docs_attachments}/akka-http-quickstart-java.zip ${target_temporal_attachments} + +## akka-http-quickstart-scala zip file +prepareTemporalFolder +fetchProject ${samples_sources}/akka-http-quickstart-scala akka-http-quickstart +zipAndAttach ${docs_attachments}/akka-http-quickstart-scala.zip ${target_temporal_attachments}