由于某些原因,我的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 _)
答案 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问题更详细: