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
}
}
}
リクエストを送信するクライアントは、バッファをバイト配列としてシリアル化し、それをリクエストの本文に直接渡す必要があります。