6

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

def page = Action {
    val protobuf = //...
    Ok(protobuf)
}
4

1 回答 1

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())
}

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

更新:

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

在此示例中,解析器采用动作的形式,但您也可以编写正文解析器:

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

发送请求的客户端应该将缓冲区序列化为字节数组,并直接在请求正文中传递。

于 2012-08-23T06:44:19.410 回答