Playframework - 请求[A]与RequestHeader

 徐州九七医院沁尿外科1 发布于 2023-02-13 12:45

我无法理解之间diffrence 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和演员级.

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

James Roper.. 7

RequestHeader表示HTTP请求的标头. Request[A]是一个RequestHeader加解析的请求体A.在播放的默认身体解析器检测到一些众所周知的体格式(application/json,application/xml,text/plain,application/x-www-form-urlencoded,multipart/form-data),并自动解析它们变成类型的主体AnyContent,然后让你通过调用方法,如访问特定类型asJson.如果你写一个像这样的动作:

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

然后类型req将是Request[AnyContent].另一方面,如果您明确指定了一个主体解析器,那么请求的类型将是该主体解析器返回的类型,例如:

def myAction = Action(parse.json) { req =>
  ...
}

在那种情况下,req将是Request[JsValue].因此,安全社交模板需要a Request[AnyContent],因此首先,这意味着您只能从使用默认主体解析器的操作中使用它.接下来,这意味着您必须将您的签名更改getLoginPage为仅接受Request[AnyContent],例如:

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

这应该按原样工作,只要每个调用的操作getLoginPage都有一个由默认的主体解析器生成的请求.

1 个回答
  • RequestHeader表示HTTP请求的标头. Request[A]是一个RequestHeader加解析的请求体A.在播放的默认身体解析器检测到一些众所周知的体格式(application/json,application/xml,text/plain,application/x-www-form-urlencoded,multipart/form-data),并自动解析它们变成类型的主体AnyContent,然后让你通过调用方法,如访问特定类型asJson.如果你写一个像这样的动作:

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

    然后类型req将是Request[AnyContent].另一方面,如果您明确指定了一个主体解析器,那么请求的类型将是该主体解析器返回的类型,例如:

    def myAction = Action(parse.json) { req =>
      ...
    }
    

    在那种情况下,req将是Request[JsValue].因此,安全社交模板需要a Request[AnyContent],因此首先,这意味着您只能从使用默认主体解析器的操作中使用它.接下来,这意味着您必须将您的签名更改getLoginPage为仅接受Request[AnyContent],例如:

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

    这应该按原样工作,只要每个调用的操作getLoginPage都有一个由默认的主体解析器生成的请求.

    2023-02-13 12:46 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有