2

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

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

谢谢

4

2 回答 2

1

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

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

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

于 2013-08-24T18:00:51.970 回答
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-encoded 格式。而您的服务器需要 JSON。我建议解决此问题的最佳方法是在发送之前进行字符串化:

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

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

于 2013-09-17T18:30:36.287 回答