如何使用 Play to return 415 不支持的媒体类型?

How to use Play to return 415 unsupported media type?

Play 1.x 似乎有此功能,但我在 2.x 文档中找不到示例。如果 acceptscontent-type 不匹配,是否可以将控制器配置为 return 415?我可以像这样在控制器中手动完成:

// for GET, POST, PUT, etc.
if (!request().accepts(Http.MimeTypes.JSON)) {
    return new StatusHeader(UNSUPPORTED_MEDIA_TYPE);
}
// for POST, PUT, PATCH, etc.
if (!request().contentType().orElse("").equals(Http.MimeTypes.JSON)) {
    return new StatusHeader(UNSUPPORTED_MEDIA_TYPE);
}

但这似乎是框架应该支持的东西 w/o 必须在每个控制器方法中使用该代码块。

Play 2.5.x 确实支持这样做。

抱歉,我的示例是在 Scala 中,但您可以使用 Java API 实现相同的效果 - 只需查看下面的文档。

// Scala example

def accept = Action(parse.json) { implicit request =>
    render {
      case Accepts.Json() => Ok(Json.parse("""{"message" : "Thanks for sending and accepting JSON"}"""))
    }
  }

通过指定您正在使用显式 parse.json 正文解析器,如果客户端尝试发送 [=13= 以外的任何内容,Play 将自动为您构建带有 415 代码的结果] 对于内容类型。请参阅涵盖此位的 the Java examples

case Accepts.Json() 是一个提取器,用于测试媒体类型是否在范围内(即您的用例中的 application/json)。如果客户端发送不同的媒体类型,那么我认为 Play 会构建一个 406 Not Acceptable。参见 the Java examples