【问题标题】:PlayFramework: Get original request xml body as stringPlayFramework:以字符串形式获取原始请求 xml 正文
【发布时间】:2015-12-29 03:54:37
【问题描述】:

我收到一个以 xml 作为正文的请求,问题是我必须读取正文中的原始字符串。 这是因为我必须读取 xml 标头中的一些 cmets 来检测文档的类型。

根据播放框架documentation,您必须告诉播放框架将请求正文解析为 xml

def sayHello = Action { request =>
  request.body.asXml.map { xml =>
    (xml \\ "name" headOption).map(_.text).map { name =>
      Ok("Hello " + name)
    }.getOrElse {
      BadRequest("Missing parameter [name]")
    }
  }.getOrElse {
    BadRequest("Expecting Xml data")
  }
}

但是,如果我尝试打印 xml.toString,我不会得到带有 cmets 的原始 xml,因为它们在主 xml 元素之外。

我也尝试过使用request.body.asText,但它会检查Content-Type 标头,因为它是application/xml,所以它不会返回字符串而是返回None

如何将请求的原始正文提取为字符串?

【问题讨论】:

    标签: xml scala playframework


    【解决方案1】:

    你可以像tolerantText一样使用

    def save = Action(parse.tolerantText) { request =>
      Ok("Got: " + request.body)
    }
    

    这个不检查 Content-Type 标头并始终加载 以字符串形式请求正文。

    https://www.playframework.com/documentation/2.4.x/ScalaBodyParsers

    【讨论】:

    • 是否有 API 可以内联执行该操作? (不在行动论点中)?目前看来 request.body.* 缺少 asTolerantText
    • 我从不这样做,也没有在文档中见面。我想你可以查看 GitHub 上的播放源代码,了解Action 如何使用请求正文解析器处理请求。
    • Too bad trophyText 不使用 UTF-8 但 ISO-8859-1 github.com/playframework/playframework/issues/5334
    • 指定时使用。来自github.com/playframework/playframework/blob/master/framework/…// Encoding notes: RFC-2616 section 3.7.1 mandates ISO-8859-1 as the default charset if none is specified. bytes.decodeString(request.charset.getOrElse("ISO-8859-1"))的源代码
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    • 2014-04-19
    • 1970-01-01
    相关资源
    最近更新 更多