【问题标题】:Parse request body with custom content-type to json in Play Framework在 Play Framework 中将具有自定义内容类型的请求正文解析为 json
【发布时间】:2015-03-18 20:32:45
【问题描述】:

我正在使用 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”,当然它不适用于当前的实现。尝试了不同的解决方案,但似乎没有任何效果。有任何想法吗? 我正在使用播放 2.1

【问题讨论】:

  • 我不太明白你的问题以及为什么它“不起作用”。你应该能够做到:WS.url(...).withHeaders(HeaderNames.CONTENT_TYPE -> "application/vnd.MyCustomType-v1+json;charset=utf-8" )
  • 问题是传入的request.body无法解析成json。错误消息:[期望文本/json 或应用程序/json 正文]

标签: scala playframework


【解决方案1】:

json 正文解析器的源代码如下所示:

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

创建您自己的解析器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-24
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多