【发布时间】:2017-02-22 17:55:19
【问题描述】:
在 Play Framework 中将 json 从 javascript 发送到服务器:
var myJson = {"name": "joe", "age":20};
var obj = JSON.parse(myJson);
$.ajax(jsRoutes.controllers.MyController.create(obj));
现在,我的 javascript 路由器配置良好。如果我将 obj 作为字符串接收,我可以将其打印到控制台就好了。
routes.conf:
POST /person/add controllers.MyController.createFromAjax(ajax: String)
但是,我想使用 Activator 给出编译时错误的异步承诺将 json 写入 MongoDB:
scala.concurrent.Future[play.api.mvc.Result][error] cannot be applied to (String)
我还有其他不带参数的路由,使用 Postman 接收 json 并将其写入 MongoDB 就好了
routes.conf
POST /heartrates/bulk controllers.HRController.createFromJson
如果我省略了从 Ajax 接收 json 而不是使用 Postman 的路由上的参数,我会在浏览器中收到 HTTP 400 错误。
POST http://localhost:9000/person/add 400 (Bad Request)
所以,我的问题是,Ajax 需要一个参数,但 String 不起作用。播放文档说 json 总是作为字符串接收。我在这里做错了什么?
Scala 控制器代码取自 Lightbend 种子 Play.Reactive.MongoDB:
def createBulkFromAjax = Action.async(parse.json) { request =>
val documents = for {
heartRate <- request.body.asOpt[JsArray].toStream
maybeHeartRate <- heartRate.value
validHeartRate <- maybeHeartRate.transform(transformer).asOpt.toList
} yield validHeartRate
for {
heartRate <- hrFuture
multiResult <- heartRate.bulkInsert(documents = documents, ordered = true)
} yield {
Logger.debug(s"Successfully inserted with multiResult: $multiResult")
Created(s"Created ${multiResult.n} heartRate")
}
}
【问题讨论】:
-
你能告诉我们你的控制器代码吗?
-
添加了 Scala 控制器代码。
标签: json ajax routes playframework-2.5