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并进行相应处理.
您不是通过注释来完成此操作,而是通过路线文件或操作中的 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)
上面调用了不同的操作,但如果您愿意,您可以使用不同的格式值调用相同的操作。
归档时间: |
|
查看次数: |
7840 次 |
最近记录: |