gpt4 book ai didi

scala - Playframework - Request[A] 与 RequestHeader

转载 作者:行者123 更新时间:2023-12-04 18:08:31 24 4
gpt4 key购买 nike

我无法理解 play.api.mvc.Request[A] 之间的区别和 play.api.mvc.RequestHeaderplay.api.mvc.Request[play.api.mvc.AnyContent] .

在编译类我有

trait Request[+A] extends scala.AnyRef with play.api.mvc.RequestHeader {
def $init$() : scala.Unit = { /* compiled code */ }
def body : A
def map[B](f : scala.Function1[A, B]) : play.api.mvc.Request[B] = { /* compiled code */ }
}
object Request extends scala.AnyRef {
def apply[A](rh : play.api.mvc.RequestHeader, a : A) : scala.AnyRef with play.api.mvc.Request[A] {
val remoteAddress : scala.Predef.String
def username : scala.None.type
val body : A
} = { /* compiled code */ }
}

请求[AnyContent] ---> RequestWithUser[play.api.mvc.AnyContent] ?
def getLoginPage[A](implicit request: Request[A], form: Form[(String, String)], msg: Option[String]): Html = {
val req = RequestWithUser(None, request)
views.html.secure.login(form, msg)(request = req)
}

此代码适用于 TemplatePlugin但它不起作用:
@(loginForm: play.api.data.Form[(String,String)], errorMsg: Option[String] = None)(implicit request: securesocial.core.RequestWithUser[_ <: play.api.mvc.AnyContent])

它不起作用,因为:
type mismatch; found : securesocial.core.RequestWithUser[A] required: securesocial.core.RequestWithUser[_ <: play.api.mvc.AnyContent] 

所以我试着把 AnyContent作为通用类型:
def getLoginPage[A](implicit request: Request[A], form: Form[(String, String)], msg: Option[String]): Html = {
val req = RequestWithUser[play.api.mvc.AnyContent](None, request)
views.html.secure.login(form, msg)(request = req)
}

但显示下一个编译错误:
type mismatch; found : play.api.mvc.Request[A] required: play.api.mvc.Request[play.api.mvc.AnyContent] 

而 play.api.mvc.AnyContent 看起来像:
package play.api.mvc
sealed trait AnyContent extends scala.AnyRef {
def $init$() : scala.Unit = { /* compiled code */ }
def asFormUrlEncoded : scala.Option[scala.Predef.Map[scala.Predef.String, scala.Seq[scala.Predef.String]]] = { /* compiled code */ }
def asText : scala.Option[scala.Predef.String] = { /* compiled code */ }
def asXml : scala.Option[scala.xml.NodeSeq] = { /* compiled code */ }
def asJson : scala.Option[play.api.libs.json.JsValue] = { /* compiled code */ }
def asMultipartFormData : scala.Option[play.api.mvc.MultipartFormData[play.api.libs.Files.TemporaryFile]] = { /* compiled code */ }
def asRaw : scala.Option[play.api.mvc.RawBuffer] = { /* compiled code */ }
}

请帮我解决这个问题。

已编辑 - 到目前为止的解决方案

我发现代码可以编译甚至运行良好。尽管如此,这不是优雅的方式,因为我使用了 asInstanceOf和 Actor 类。
def getLoginPage[A](implicit request: Request[A], form: Form[(String, String)], msg: Option[String]): Html = {
implicit val r = RequestWithUser[play.api.mvc.AnyContent](None, request.asInstanceOf[Request[AnyContent]])
views.html.secure.login(form, msg)(request = r)
}

最佳答案

RequestHeader表示 HTTP 请求的 header 。 Request[A]RequestHeader加上解析后的请求正文 A . Play 中的默认正文解析器会检测一些众所周知的正文格式( application/jsonapplication/xmltext/plainapplication/x-www-form-urlencodedmultipart/form-data ),并将它们自动解析为类型 7 |1045|1 的正文,然后您可以通过调用诸如 AnyContent 之类的方法来访问特定类型。 .如果你写一个像这样的 Action :

def myAction = Action { req =>
...
}

然后是 asJson的类型将是 req .另一方面,如果您显式指定正文解析器,则请求的类型将是正文解析器返回的类型,例如:
def myAction = Action(parse.json) { req =>
...
}

在这种情况下, Request[AnyContent]将是 req .因此,安全社交模板需要一个 Request[JsValue] ,所以首先,这意味着您只能从使用默认正文解析器的操作中使用它。接下来,这意味着您必须更改 Request[AnyContent] 的签名只接受 getLoginPage ,例如:
def getLoginPage(implicit request: Request[AnyContent], form: Form[(String, String)], msg: Option[String]): Html = {
val req = RequestWithUser(None, request)
views.html.secure.login(form, msg)(request = req)
}

只要调用 Request[AnyContent] 的每个操作都可以按原样工作有一个由默认正文解析器生成的请求。

关于scala - Playframework - Request[A] 与 RequestHeader,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20339315/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com