当前位置: 首页 > 知识库问答 >
问题:

在Play框架中将具有自定义内容类型的请求正文解析为json

卢光远
2023-03-14

我使用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-v1json;charset=utf-8”,当然,它不适用于当前的实现。他们尝试了不同的解决方案,但似乎没有任何效果。有什么想法吗?我正在使用play 2.1

共有1个答案

西门山
2023-03-14

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

Json本身是一个主体解析器,它在不检查内容类型头的情况下进行json解析,所以您应该能够使用它来解析您的请求,而不是parse.json

如果您想更进一步,让解析器检查特定的内容类型标题,那么您可以使用

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

创建自己的解析器。

 类似资料:
  • 我对Symfony和API平台很陌生。我正在尝试创建一个自定义资源/操作,该资源/操作接收请求的正文,根据值从数据库中获取数据,然后将实体集合返回给客户端。 示例:具有以下正文的 请求: 根据这些属性,我想查询数据,进行计算,然后返回数据。 我试图弄清楚如何使这个API平台的方式。我已经在谷歌上搜索并在留档中寻找了几个小时,但我找不到实现这一目标的方法。 我尝试使用和如下所示的控制器查询数据: 但

  • 当我在模型类中将变量定义为字符串时,它在DB中被转换为“VARCHAR(255)”。 但是,我想保存超过255个,因为这个数据是由几个段落组成的非常长的文本。 据我所知,DB中有一种TEXT类型来保存很长的文本。 如何在Play中定义TEXT类型!框架? 我尝试了约束。MaxLength和约束。游戏中定义的最大值!框架api。 然而,仍然是1。sql文件(由Ebean DDL自动创建)将此变量定义

  • 我有一个使用axios发送post请求的表单。问题在于,发送请求时使用的标题的内容类型为:multipart/form data。我的nodejsapi不喜欢这样,它给了我一个未定义的req。身体 我有其他使用相同技术的表单,它们可以工作,标题与预期的一样:Content-Type:application/json;字符集=UTF-8 张贴Content-Type: Multipart/form-

  • 我在Windows10上的VisualStudio中用C#编写了一个示例代码,该代码试图将带有自定义头的POST请求发送到运行在的服务http://localhost:9998这是失败的。 当我查看请求时,内容类型标题字段将作为ContentType(无连字符)发送。 httpRequestMessage:方法:POST,请求URI:'http://localhost:9998/,版本:1.1,内

  • 我一直在尝试实现RESTFul体系结构,但我完全搞不清自定义媒体类型是好是坏。 目前,我的应用程序使用Http-Link:header传递“链接”。这很好,我将其与title属性一起使用,允许服务器描述这个“动作”到底是什么,尤其是当呈现给用户时。 我感到困惑的是是否应该指定自定义mime类型。例如,我有一个用户的概念。它可能与当前资源相关联。我要编一个例子,说我有一件拍卖品。我们可能有一个用户在

  • 问题内容: 我正在尝试绘制Play框架如何支持转义。 这是一个很好的页面,阐明了所需的功能:https : //www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet 因此,我尝试将其与Play模板功能相关联,并充分了解Play的功能和不功能。 HTML转义:或函数 属性转义:我找不到内置解决方案