在播放中请求内容类型!REST Web服务的框架

ray*_*ymi 5 rest content-type playframework

我正在尝试使用Play实现REST Web服务!框架.我知道如何通过指定多个模板以不同的格式(JSON,XML,HTML,...)返回响应.但是,我没有找到任何关于如何在(例如POST)请求(表单编码,JSON,XML,...)中处理不同内容类型的信息.

是否可以注释方法以仅匹配某些内容类型(类似@Consumes)?我是否必须if使用控制器方法中的-clause 区分不同的请求Content-Types ?

小智 6

查看用于组合体解析器的Play文档:

http://www.playframework.com/documentation/2.2.0/ScalaBodyParsers

如果你想将一个帖子主体约束为只有xml或json,你可以在这些行上写一些东西:

val xmlOrJson = parse.using {
  request =>
    request.contentType.map(_.toLowerCase(Locale.ENGLISH)) match {
      case Some("application/json") | Some("text/json") => play.api.mvc.BodyParsers.parse.json
      case Some("application/xml") | Some("text/xml") => play.api.mvc.BodyParsers.parse.xml
      case _ => play.api.mvc.BodyParsers.parse.error(Future.successful(UnsupportedMediaType("Invalid content type specified")))
    }
}

def test = Action(xmlOrJson) {
  request =>
    request.body match {
      case json: JsObject => Ok(json) //echo back posted json
      case xml: NodeSeq => Ok(xml) //echo back posted XML
    }
}
Run Code Online (Sandbox Code Playgroud)

xmlOrJson函数查看内容类型请求标头以确定正文解析器.如果它不是xml或json,那么它将返回带有UnsupportedMediaType响应的错误正文解析器(HTTP 415).

然后,您将此函数作为要约束到xml或json内容的任何操作的主体解析器传递.在操作中,您可以查看正文以确定是否已解析xml或json并进行相应处理.


Cod*_*nci 3

您不是通过注释来完成此操作,而是通过路线文件或操作中的 if 语句来完成。取决于您的用例,哪一种最适合。

以下 URL 为您提供了有关内容协商的路由文件的一些信息。http://www.playframework.org/documentation/1.2.4/routes#content-types

例子

GET    /index.xml         Application.index(format:'xml')  
GET    /index.json        Application.indexJson(format:'json')  
Run Code Online (Sandbox Code Playgroud)

上面调用了不同的操作,但如果您愿意,您可以使用不同的格式值调用相同的操作。