pekko-http avro marshalling/unmarshalling for generated java avro specific records
Version | Release date | Pekko Http version | Avro version | Scala versions |
---|---|---|---|---|
1.0.0 |
2023-11-02 | 1.0.0 |
1.11.3 |
3.3.1 , 2.13.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" %% "pekko-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/raw
: binary without schemaContent-Type: avro/binary
: binary with schema (see schema resolution)
-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 org.apache.pekko.http.scaladsl.server.Directives._
import fr.davit.pekko.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.