pekko-http protobuf and json marshalling/unmarshalling for ScalaPB messages
| Version | Release date | Pekko Http version | ScalaPB version | Scala versions |
|---|---|---|---|---|
1.0.0 |
2023-11-02 | 1.0.0 |
0.11.4 |
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-scalapb" % <version> // binary & json supportFor the examples, we are using the following proto domain model
message Item {
string name = 1;
int64 id = 2;
}
message Order {
reapeated Item items = 1;
}The implicit marshallers and unmarshallers for your generated proto classes are defined in ScalaPBSupport. You
simply need to have them in scope.
import org.apache.pekko.http.scaladsl.server.Directives._
import fr.davit.pekko.http.scaladsl.marshallers.scalapb.ScalaPBSupport._
object MyProtoService {
val route =
get {
pathSingleSlash {
complete(Item("thing", 42))
}
} ~ post {
entity(as[Order]) { order =>
val itemsCount = order.items.size
val itemNames = order.items.map(_.name).mkString(", ")
complete(s"Ordered $itemsCount items: $itemNames")
}
}
}Marshalling/Unmarshalling of the generated classes depends on the Accept/Content-Type header sent by the client:
Content-Type: application/json: jsonContent-Type: application/x-protobuf: binaryContent-Type: application/x-protobuffer: binaryContent-Type: application/protobuf: binaryContent-Type: application/vnd.google.protobuf: binary
No Accept header or matching several (eg Accept: application/*) will take the 1st matching type from the above list.
If you are using scalaPB for json (un)marshalling only, you can use ScalaPBJsonSupport from the sub module
libraryDependencies += "fr.davit" %% "pekko-http-scalapb-json4s" % <version> // json support onlyIf you are using scalaPB for binary (un)marshalling only, you can use ScalaPBBinarySupport form the sub module
libraryDependencies += "fr.davit" %% "peko-http-scalapb-binary" % <version> // binary support onlyOnly json (un)marshallers are able to support collections of proto messages as root object.
Entity streaming (http chunked transfer) is at the moment not supported by the library.