Play 允许您直接在控制器中返回许多不同的类型,例如JsValue
或XML
与纯文本一起返回。我想扩展它以接受协议缓冲区,所以我可以写:
def page = Action {
val protobuf = //...
Ok(protobuf)
}
Play 允许您直接在控制器中返回许多不同的类型,例如JsValue
或XML
与纯文本一起返回。我想扩展它以接受协议缓冲区,所以我可以写:
def page = Action {
val protobuf = //...
Ok(protobuf)
}
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())
}
这些将允许 Play 在由状态给出的响应中直接序列化缓冲区,例如Ok(protobuf)
我已经发布了一个相反情况的工作示例,其中可以解析传入的请求并且可以自动提取 protobuf。
在此示例中,解析器采用动作的形式,但您也可以编写正文解析器:
object Put extends Controller {
def index = DecodeProtobuf(classOf[MyProtobuf]) { stack :MyProtobuf =>
Action {
// do something with stack
}
}
}
发送请求的客户端应该将缓冲区序列化为字节数组,并直接在请求正文中传递。