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 に答える