【问题标题】:proper way to send ajax json to play framework发送ajax json播放框架的正确方法
【发布时间】:2014-04-04 00:04:58
【问题描述】:

我在这里阅读了几篇关于如何执行此操作的帖子,但我只能让它工作到一半。

这可行(将 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 发送,因为当我转换为字符串时,描述中恰好有一个撇号 (') 会搞砸。我可能会避开撇号,但希望我错过了一些关于如何使用对象而不是字符串来执行此操作的简单内容。

谢谢

【问题讨论】:

    标签: ajax json scala playframework-2.0


    【解决方案1】:

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

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

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

    【讨论】:

    • 我对问题进行了一些修改。我现在明白 dataType 与响应有关,但我仍然在发送 JSON 对象时遇到问题。在我看来,它像有效的 JSON,但我不断收到“无效 JSON”400 错误。这不是由我的控制器代码直接抛出的,因为它永远无法到达 Logging 语句。
    • 我遇到了同样的问题。答案已检查,但我没有看到任何不同。您还需要对 json 对象进行字符串化吗?
    【解决方案2】:

    如果您尝试在 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-encoded 格式。而您的服务器需要 JSON。我建议解决此问题的最佳方法是在发送之前进行字符串化:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多