发送ajax json到播放框架的正确方法

时间:2013-08-24 17:26:01

标签: ajax json scala playframework-2.0

我已经在这里阅读了几篇关于如何做到这一点的帖子,我可以让它只在中途工作。

这有效(将json对象作为文本发送):

            function go(itemid)
            {
                apiRoutes.controllers.Application.addItem(itemid).ajax({
                    data:  '{"reqid":0,"iid":2,"description":"adsf"}',
                    dataType:  'text',
            contentType:'application/json',
                    success: function(reply) {
                        alert(reply)
                    }
                });
            }

这不是(将对象作为json发送):

            function go(itemid)
            {
                apiRoutes.controllers.Application.addItem(itemid).ajax({
                    data:  {"reqid":0,"iid":2,"description":"adsf"},
                    dataType:  'text',
            contentType:'application/json',
                    success: function(reply) {
                        alert(reply)
                    }
                });
            }

我真正想做的就是这样(我已经设置了合适的组合器):

            function go(itemid)
            {
                apiRoutes.controllers.Application.addItem(itemid).ajax({
                    data:  @Html(Json.stringify(Json.toJson(item))),
                    dataType:  'text',
            contentType:'application/json',
                    success: function(reply) {
                        alert(reply)
                    }
                });
            }

我的控制器看起来像这样:

  def addItem(id: Long) = Action (parse.json) { implicit request =>
    Logger.info("add item")
    request.body.validate(Item.itemReads).map { item =>
    thing.addItem(item)
    Ok("Succesfully added item.")
    }.recoverTotal{
      e => BadRequest("Detected error:"+ JsError.toFlatJson(e))
    }
  }

在第二种情况下,它永远不会到达日志代码。相反,它立即返回400 Bad Request(这可能是我认为在Action(parse.json)位中触发的事情。)

我宁愿将对象作为json发送,因为当我转换为字符串时,描述中恰好有一个撇号(')会让事情变得混乱。我可以逃避撇号,但希望我错过了一些关于如何用对象而不是字符串来做这件事的简单。

由于

2 个答案:

答案 0 :(得分:1)

API中所述,dataType参数用于设置:

  

希望从服务器返回的数据类型

要发送json,请使用第二种方法(不要将其作为字符串发送)。使用Web浏览器检查器验证是否发送了正确的数据。接收到有效的JSON对象后,AFAIK对Handling the JSON request不应该有问题

答案 1 :(得分:0)

如果您尝试在Jquery中发送非字符串化的JSON对象,$ .ajax会自动尝试使用$ .param处理它,

如果ajax调用中的数据如下所示:

data:  {"reqid":0,"iid":2,"description":"adsf"}

这是$ .ajax在发送之前正在做的事情:

$.param({"reqid":0,"iid":2,"description":"adsf"})
// "reqid=0&iid=2&description=adsf"

它接受JSON并将其序列化为form-url编码格式。而您的服务器期待JSON。我建议解决这个问题的最佳方法是在发送之前进行字符串化:

data:  JSON.stringify({"reqid":0,"iid":2,"description":"adsf"})

来源:http://api.jquery.com/jQuery.ajax/#sending-data-to-server