JSON Post不使用jQuery Ajax调用,当我使用Curl时可以正常工作

时间:2015-11-25 02:26:45

标签: jquery json playframework

由于某些原因,我的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 _)

2 个答案:

答案 0 :(得分:1)

我不太了解,所以我无法解释为什么这应该有效,但让我们试一试:

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){
    }
});

答案 1 :(得分:1)

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

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

这些SO问题更详细: