gpt4 book ai didi

json - 使用 Action(parse.json) 时如何禁用 HTML 错误响应?

转载 作者:行者123 更新时间:2023-12-01 11:23:20 25 4
gpt4 key购买 nike

在使用 Play Framework (2.4) 实现的 REST API 中,我使用 Action(parse.json)从传入的 POST 请求正文中解析 JSON。

使用我当前的代码(见下文),

  • 发布带有缺失字段的有效 JSON(例如 {"foo": ""})会产生400 响应正文 {"error":"Missing input fields"}。这很好并且在意料之中。 👍

  • 发布完全无效的 JSON(例如 {,,,}{\00})会产生400 个 long HTML response body . 👎 这来自内心的某个地方parse.json.

在后一种情况下,如何摆脱 HTML 响应主体?我希望响应主体包含一个简短的 JSON 错误消息(例如 {"error":"无效的 JSON 输入"}),或者什么都没有。 Play 是否为此提供配置选项,或者我是否需要创建自定义操作?最简单的方法是什么?

Controller 方法:

def test = Action(parse.json) { request =>
request.body.validate[Input].map(i => {
Ok(i.foo)
}).getOrElse(BadRequest(errorJson("Missing input fields")))
}

上面用到的其他东西:

case class Input(foo: String, bar: String)

object Input {
implicit val reads = Json.reads[Input]
}

case class ErrorJson(error: String)

object ErrorJson {
implicit val writes = Json.writes[ErrorJson]
}

private def errorJson(message: String) = Json.toJson(ErrorJson(message))

最佳答案

长 html 由默认的 HttpErrorHandler 生成。您可以通过以下方式提供自己的 this guide .引用示例代码:

class ErrorHandler extends HttpErrorHandler {

def onClientError(request: RequestHeader, statusCode: Int, message: String) = {
Future.successful(
Status(statusCode)("A client error occurred: " + message)
)
}

def onServerError(request: RequestHeader, exception: Throwable) = {
Future.successful(
InternalServerError("A server error occurred: " + exception.getMessage)
)
}
}

注意:如果您在没有 Guice 的情况下管理依赖项,则必须在 ApplicationLoader

中提供自定义的 HttpErrorHandler

关于json - 使用 Action(parse.json) 时如何禁用 HTML 错误响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39794500/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com