使用Play Framework和$ .ajax消耗JSON

时间:2013-05-24 19:01:29

标签: ajax json rest playframework playframework-2.1

我还是RESTful API和JSON的新手,所以我尝试查看jQuery文档和Play sending JSON to a URIparsing JSON from a request body

不幸的是,我遇到了一些意想不到的行为。

这是我的AJAX电话:

$.ajax({
            url: "@routes.Application.downloadResults",
            data: {
                uuid: $('body').attr('uuid')
            },
            dataType: 'json',
            contentType: "application/json; charset=utf-8",
            success: function(res) {
                console.log('success')
            },
            error: function(res) {
                console.log('error')
            }
        })

这是我的服务器代码:

  def downloadResults = Action { request =>
    Logger.info("Attempting to download")
    Logger.info(request.toString)
    Logger.info(request.body.toString)
    Logger.info(request.body.asJson.toString)
    request.body.asJson.map { json =>
      {
    Logger.info(json.toString)
    json.validate[String].map {
      case uuid => {
        Logger.info(s"Looking for results-$uuid.txt")
        Ok.sendFile(new File(s"results-$uuid.txt"))
      }
    }.recoverTotal {
      e =>
        {
          Logger.info("Detected error: " + JsError.toFlatJson(e))
          BadRequest("Detected error: " + JsError.toFlatJson(e))
        }
    }
      }
    }.getOrElse {
      Logger.info("Expecting Json data")
      BadRequest("Expecting Json data")
    }
  }

以下是生成的服务器日志:

[info] application - Attempting to download
[info] application - GET /download?uuid=12512502-5ca4-47bc-a4db-15f1da1979fc
[info] application - AnyContentAsEmpty
[info] application - None
[info] application - Expecting Json data

以下是生成的浏览器控制台:

GET http://localhost:9000/download?uuid=12512502-5ca4-47bc-a4db-15f1da1979fc 400 (Bad Request) jquery-1.9.0.min.js:3
error

看起来uuid作为参数附加到URI,但我试图将其作为JSON发送。我想现在它到达那里的方式并不重要,但我正在努力加强我对使用JSON进行客户端 - 服务器通信的理解。我尝试在JSON数据上调用Json.stringify,但这只会在我的服务器日志中生成GET /download?{%22uuid%22:%224de4c3dd-24db-49dc-8f9e-4d3e0d90dea5%22}

有关如何使这项工作的任何提示?

1 个答案:

答案 0 :(得分:2)

使用$.ajax()时,JQuery默认使用GET方法。这就是您的内容被附加到网址的原因。

您应该尝试向type: "POST"电话添加$.ajax。这将告诉jQuery在请求正文中而不是在URL中发送您的数据。

另外,请确保在应用程序routes配置文件中使用POST方法声明路由。