akka-http avro marshalling/unmarshalling for generated java avro specific records
After the akka licencing change,
no further development is expected on akka-http-avro
.
If you're migrating to pekko-http, see pekko-http-avro.
Version | Release date | Akka Http version | Avro version | Scala versions |
---|---|---|---|---|
0.1.3 |
2022-04-24 | 10.2.9 |
1.11.0 |
2.13.8 , 2.12.15 |
0.1.2 |
2020-09-18 | 10.2.0 |
1.10.0 |
2.13.3 , 2.12.12 |
0.1.1 |
2020-07-03 | 10.1.12 |
1.10.0 |
2.13.3 , 2.12.11 , 2.11.12 |
0.1.0 |
2020-03-01 | 10.1.11 |
1.9.2 |
2.13.1 , 2.12.10 , 2.11.12 |
The complete list can be found in the CHANGELOG file.
Libraries are published to Maven Central. Add to your build.sbt
:
libraryDependencies += "fr.davit" %% "akka-http-avro" % <version>
For the examples, we are using the following avro domain model
{
"namespace": "com.example",
"type": "record",
"name": "Item",
"fields": [
{
"name": "name",
"type": "string"
},
{
"name": "id",
"type": "long"
}
]
}
and
{
"namespace": "com.example",
"type": "record",
"name": "Order",
"fields": [
{
"name": "items",
"type": {
"type" : "array",
"items": "com.example.Item"
}
}
]
}
Marshalling/Unmarshalling of the generated classes depends on the Accept
/Content-Type
header sent by the client:
Content-Type: application/json
: jsonContent-Type: avro/binary
: binary
-No Accept
header or matching several (eg Accept: application/*
) will take the 1st matching type from the above list.
The implicit marshallers and unmarshallers for your generated avro classes are defined in
AvroSupport
. Specific (un)marshallers can be imported from AvroBinarySupport
, AvroJsonSupport
.
You simply need to have them in scope.
import akka.http.scaladsl.server.Directives._
import fr.davit.akka.http.scaladsl.marshallers.avro.AvroSupport._
object MyAvroService {
val route =
get {
pathSingleSlash {
complete(Item.newBuilder().setName("thing").setId(42).build())
}
} ~ post {
entity(as[Order]) { order =>
val itemsCount = order.getItems.size
val itemNames = order.getItems.asScala.map(_.getName).mkString(", ")
complete(s"Ordered $itemsCount items: $itemNames")
}
}
}
Entity streaming (http chunked transfer) is at the moment not supported by the library.