格式错误的AJAX请求?问题出在哪里?

时间:2012-03-21 18:22:19

标签: jquery ajax spring model-view-controller

这是我的AJAX电话:

var dataString = "{existingProject:'"+ $("#existingProject").val() + "',newProjName:'" + $("#newProjName").val()+"'}";
$.ajax({
        type: "POST",
        url: "manageProjects.html",
        data: dataString,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (msg) {
            alert(msg.status + " " + msg.responseText);
            $("#grid").trigger("reloadGrid");
        },
        error: function (errormessage) {
            alert(errormessage.status + " " + errormessage.responseText);
        }
    });

..这里是我的Spring MVC控制器中的方法签名我期望处理请求:

@RequestMapping(value="/manageProjects",produces="application/json",method=RequestMethod.POST)
public StatusResponse manageProjects(
        @RequestParam("existingProject") String existingProj,
        @RequestParam("newProjName") String newProj,
        HttpSession session){

我整天都在修补这个ajax电话,我只是没有看到这个问题。我已经尝试使用带有数据参数的load,post,我尝试过没有设置contentType和dataType以及它。

错误消息中的responseText告诉我调用在语法上不正确....但是没有任何关于为什么......

的线索

我错过了一些愚蠢的东西。感谢您的任何见解...

3 个答案:

答案 0 :(得分:0)

这不是有效的JSON。

只做

var dataString = JSON.stringify({
    existingProject: $("#existingProject").val(),
    newProjName: $("#newProjName").val()
});

这适用于大多数浏览器。在旧版浏览器中,您必须包含类似于http://www.sitepoint.com/javascript-json-serialization/的定义。请注意,此处的定义允许您使用先前定义的(本机)版本(如果存在)。

var JSON = JSON || {};  
// implement JSON.stringify serialization
JSON.stringify = JSON.stringify || function (obj) {
    var t = typeof (obj);
    if (t != "object" || obj === null) {
        // simple data type
        if (t == "string") obj = '"'+obj+'"';
        return String(obj);
    }
    else {
        // recurse array or object
        var n, v, json = [], arr = (obj && obj.constructor == Array);
        for (n in obj) {
            v = obj[n]; t = typeof(v);
            if (t == "string") v = '"'+v+'"';
            else if (t == "object" && v !== null) v = JSON.stringify(v);
            json.push((arr ? "" : '"' + n + '":') + String(v));
        }
        return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");
    }
};

答案 1 :(得分:0)

您是否尝试过将数据放入对象并将其设置为$ .ajax数据选项?

不必进行字符串化。

var data= {"existingProject" : $("#existingProject").val(), "newProjName" : $("#newProjName").val()};

$.ajax({
        type: "POST",
        url: "manageProjects.html",
        data: data,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (msg) {
            alert(msg.status + " " + msg.responseText);
            $("#grid").trigger("reloadGrid");
        },
        error: function (errormessage) {
            alert(errormessage.status + " " + errormessage.responseText);
        }
    });

答案 2 :(得分:0)

我遇到了同样的问题。我在firefox中使用了篡改数据插件来检查jquery发送的数据。有效载荷是:

  

POSTDATA =消息=测试+消息

我在我的JQuery请求中应用了JayC给出的修改并且它有效。细节:

JayC给出的修改:

var dataString = JSON.stringify({
existingProject: $("#existingProject").val(),
newProjName: $("#newProjName").val()
});

我的要求:

      function post(dest) {
            var dataString = JSON.stringify({ message: 'test message'});
            jQuery.ajax({
                type: "POST",
                url: ndest,
                crossDomain: true,
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                data: dataString,
                success: function (data, status, jqXHR) {                       
                },
                error: function (response, textStatus, errorThrown) {
                    handleError(response, textStatus, errorThrown);
                }
            });
        };  

处理请求的Spring mvc控制器部分:

@RequestMapping(value="myapp/{id}", method={RequestMethod.POST, RequestMethod.PUT})
@ResponseStatus(HttpStatus.CREATED)
public void setNote(@PathVariable("id") String user,  @RequestBody MyModel content) {

现在有效载荷是:

  

POSTDATA = {“message”:“test message”}

一些提示:

  • 使用篡改数据或任何其他嗅探器来检查您的请求的有效负载
  • 我看到你的方法参数中没有@RequestBody。也许你的json无法被解析,因为你什么都不要求。尝试添加@RequestBody MyClass content。 MyClass应该有正确的相应getter和setter以及一个空的构造函数。