在Play Framework中将自定义内容类型的请求体解析为json

时间:2015-03-18 09:47:01

标签: scala playframework

我正在使用play代理来自ui的API调用。例如POST:

def post(url: String) = Action { implicit request =>
    Async {
      WS.url(proxyUrl + request.uri)
        .withQueryString(request.queryString.mapValues(_.head).toSeq: _*)
        .withHeaders(request.headers.toMap.mapValues(_.head).toSeq: _*)
        .post(request.body.asJson).map(response => Ok(response.body))
    }
}

但这只能处理“application / json”和“text / json”内容类型。但是现在我想用自定义内容类型发出请求:“application / vnd.MyCustomType-v1 + json; charset = utf-8”,当然它不适用于当前的实现。尝试了不同的解决方案,但似乎没有任何效果。有任何想法吗? 我正在使用Play 2.1

1 个答案:

答案 0 :(得分:1)

json body解析器的源代码如下:

def json(maxLength: Int): BodyParser[JsValue] = when(
  _.contentType.exists(m => m.equalsIgnoreCase("text/json") || m.equalsIgnoreCase("application/json")),
  tolerantJson(maxLength),
  createBadResult("Expecting text/json or application/json body")
)

tolerantJson本身是一个正文解析器,可以在不检查内容类型标头的情况下进行json解析,因此您应该能够使用它来解析您的请求,而不是parse.json

如果您想进一步使用解析器来检查特定的content-type标题,那么您可以使用

when(
  _.contentType.exists(m => m.equalsIgnoreCase(expectedContentType)),
  tolerantJson(maxLength),
  createBadResult("Wrong content type")
)

创建自己的解析器。