私はボディと一致させるために必要なhmacヘッダを持つ投稿要求を受け取りました。このヘッダーは要求の元のボディを使用して作成されており、変更する方法はありません。要求のコンテンツタイプはapplication/jsonです。現在、要求の元のボディとjsonでエンコードされたリクエストのボディにアクセスする方法はないようです。したがって、元のボディと元のリクエストを一緒にバンドルして渡すカスタムボディパーサーとアクションを作成しようとしていますそれらに。[2.5.x]カスタムボディパーサを実行して、未処理のボディを取得し、リクエストと共にバンドルします。
私はこの男の実装https://victorops.com/blog/capturing-raw-requests-play/をコピーしようとしていますが、これはプレ・プレイ2.5ですので、akkaストリームの代わりにiterateesを使用しています。
object RequestArchiver {
case class RawRequest[A](request: Request[A], raw: ByteString) extends WrappedRequest[A](request)
case class WrappedPayload[A](wrapped: A, raw: ByteString)
def wrappedBodyParser[B](wrapped: BodyParser[B]) (implicit exCtx: ExecutionContext): BodyParser[WrappedPayload[B]] =
BodyParser("raw-memo") { (request: RequestHeader) =>
val raw: Accumulator[ByteString, Either[Result, RawBuffer]] = BodyParsers.parse.raw(request)
val ret = raw.map {
case Left(result) =>
Left(result)
case Right(buffer: RawBuffer) =>
val bytes = buffer.asBytes().getOrElse(ByteString.empty)
Right(WrappedPayload(wrapped(request), bytes))
}
ret
}
}
これは今
Error:(33, 5) type mismatch;
found : play.api.libs.streams.Accumulator[akka.util.ByteString,Product with Serializable with scala.util.Either[play.api.mvc.Result,controllers.RequestArchiver.WrappedPayload[play.api.libs.streams.Accumulator[akka.util.ByteString,Either[play.api.mvc.Result,B]]]]]
required: play.api.libs.streams.Accumulator[akka.util.ByteString,Either[play.api.mvc.Result,controllers.RequestArchiver.WrappedPayload[B]]]
ret
^
私はそれをしようとしているかを見ることができますエラーでコンパイルできない
BodyParserとケースクラス:ここ
は、私がこれまで持っているものです私に教えてください。私はそれを修正する方法がわかりません。私は解決策は、リンクでvictorops例のライン15と24の間にある想像が、私は2.5バージョン場合は、カスタムアクション、それが
def extractRaw[A](parser: BodyParser[A])(block: (RawRequest[A]) => Future[Result])(implicit ctx: ExecutionContext) =
Action.async(RequestArchiver.wrappedBodyParser(parser)) { implicit request =>
val rawRequest = RawRequest(Request(request, request.body.wrapped), request.body.raw)
block(rawRequest)
}