【问题标题】:JSON Post not working with jQuery Ajax call, works when I use CurlJSON Post 不适用于 jQuery Ajax 调用,当我使用 Curl 时有效
【发布时间】:2015-11-25 02:26:45
【问题描述】:

由于某种原因,我的 jQuery ajax 请求无法正常工作。每次我单击调用以下 javascript 的按钮时,POST 都不成功,并且出现错误:

{"status":"KO","message":"error"} (see my controller action method).

如果我使用 curl,它可以正常工作,我会得到“它可以工作!”的响应:

 curl --include --request POST --header "Content-type: application/json" --data '{"articleId":28, "isApproved": true}' http://localhost:9000/article/changeStatus

我似乎做的一切都正确,我正在对 json 部分进行字符串化,设置内容类型,这里可能有什么问题?

var d = JSON.stringify({"articleId": articleId, "isApproved": isApproved});
$.ajax({
    "type": "POST",
    "url": "/article/changeStatus",
    "data": d,
    "dataType": "json",
    "contentType": "application/json;charset=utf-8",
    "success": function(p) {
        alert('success is ' + p.isSuccess + ' message=' + p.message);
    },
    "error": function(p) {

    },
    "complete": function(p){
    }
});

我的控制器动作如下:

def changeStatus = Action(BodyParsers.parse.json) {  request =>
   val changeStatusRequest = request.body.validate[ChangeStatusRequest]
   changeStatusRequest.fold(
     errors => {
       BadRequest(Json.obj("status" ->"KO", "message" -> "error"))
     },
     cmRequest => {

       Ok("it works!")
     }
   )


 }


 case class ChangeStatusRequest(articleId: Int, isApproved: Boolean)

读音是:

implicit val changeStatusRequest: Reads[ChangeStatusRequest] = (
    (JsPath \ "articleId").read[Int] and
      (JsPath \ "isApproved").read[Boolean]
    )(ChangeStatusRequest.apply _)

【问题讨论】:

  • 您能否向我们展示您验证使用的读取代码。
  • @wwkudu 我添加了读取,对此感到抱歉。

标签: jquery json playframework


【解决方案1】:

有趣。这对我来说并不是很明显。我在你的控制器中尝试了play.Logger.debug(errors.mkString("\n")) 来检查折叠是否有任何问题,但它没有。

原来datatype: json 对是罪魁祸首。您正在返回一个 Ok,即正常的 HTML 页面,因此它不能解析为 json,因此 ajax 方法会引发错误。

这些 SO 问题更详细:

【讨论】:

  • 我看到了这个错误: fold.errors (/articleId,List(ValidationError(error.expected.jsnumber,WrappedArray()))) 我猜 stringify 正在把 id 变成一个字符串?如何解决这个问题?
  • 感谢调试提示,帮助分配!
  • ;) 很高兴听到它。播放表单将值存储为字符串,所以我猜 stringify({"articleId": Number(articleId)... 如果它来自表单值
【解决方案2】:

我知道的不多,所以我无法解释为什么这应该有效,但让我们试一试:

var d = JSON.stringify({"articleId": articleId, "isApproved": isApproved});
$.ajax({
    type: "POST",
    url: "/article/changeStatus",
    data: d,

    contentType: "application/json;charset=utf-8",
    success: function(p) {
        alert('success is ' + p.isSuccess + ' message=' + p.message);
    },
    error: function(p) {

    },
    complete: function(p){
    }
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-16
    • 2011-07-08
    • 2015-08-05
    • 2016-06-07
    • 2020-06-30
    • 2013-02-20
    • 2011-04-04
    • 2016-05-26
    相关资源
    最近更新 更多