PlayFramework:以字符串形式获取原始请求 xml 正文

Posted

技术标签:

【中文标题】PlayFramework:以字符串形式获取原始请求 xml 正文【英文标题】:PlayFramework: Get original request xml body as string 【发布时间】: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

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

【问题讨论】:

【参考方案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"))的源代码

以上是关于PlayFramework:以字符串形式获取原始请求 xml 正文的主要内容,如果未能解决你的问题,请参考以下文章

以原始形式将数据保存在数据库中并以 json 格式获取结果

以字符串形式存储在 Pandas 数据框列中的解析列表

原始形式的 OpenCV svm(绝对值 alpha )

Swift枚举使用String值获取Int Enum的值

DB::table Select() 以字符串形式返回数组 Laravel

我以元组形式获取 SELECT mysql 值。如何以字符串形式获取它?