如何在Play中直接返回协议缓冲区!2.0框架?

Jac*_*ter 6 scala protocol-buffers playframework-2.0

Play允许您直接在控制器中返回许多不同类型,例如JsValueXML与纯文本一起.我想扩展它以接受协议缓冲区,所以我可以写:

def page = Action {
    val protobuf = //...
    Ok(protobuf)
}
Run Code Online (Sandbox Code Playgroud)

Jac*_*ter 10

Java中的协议缓冲区都从单个com.google.protobuf.Message类继承.

在应用程序控制器的范围内添加以下隐式转换:

implicit def contentTypeOf_Protobuf: ContentTypeOf[Message] = {
  ContentTypeOf[Message](Some("application/x-protobuf"))
}
implicit def writeableOf_Protobuf: Writeable[Message] = {
  Writeable[Message](message => message.toByteArray())
}
Run Code Online (Sandbox Code Playgroud)

这些将允许Play直接在由状态给出的响应中序列化缓冲区 Ok(protobuf)

更新:

我已经发布了一个反向情况的工作示例,其中可以解析传入的请求并自动提取protobuf.

在这个例子中,解析器采用动作的形式,你也可以编写一个身体解析器:

object Put extends Controller {
  def index = DecodeProtobuf(classOf[MyProtobuf]) { stack :MyProtobuf =>
    Action {
      // do something with stack
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

发送请求的客户端应将缓冲区序列化为字节数组,并将其直接传递给请求主体.