dataType:'json'vs data:$ .ajax中的JSON.stringify(obj)

时间:2013-01-10 16:29:11

标签: jquery ajax json

我有这个数据结构:

var formValues = {
        TemporaryToken: a.userStatus.get("TemporaryToken"),
        MemorableWordPositionAndValues:[
            {
                Position: a.userStatus.get("MemorableWordPositions")[0],
                Value: this.$('[name="login-memorable-character-1"]').val()
            },
            {
                Position: a.userStatus.get("MemorableWordPositions")[1],
                Value: this.$('[name="login-memorable-character-2"]').val()
            },
            {
                Position: a.userStatus.get("MemorableWordPositions")[2],
                Value: this.$('[name="login-memorable-character-3"]').val()
            }
        ]
    }

当我用$ .ajax这样发送它时:

$.ajax({
        url:url,
        type:'PUT',
        //dataType:"json",
        data: JSON.stringify(formValues),
        success:function (data) {

        }
    });

它发送请求。但是,如果我这样发送:

$.ajax({
        url:url,
        type:'PUT',
        dataType:"json",
        data: formValues,
        success:function (data) {

        }
    });

我收到400 Bad Request。这是服务器上的问题还是JSON.stringify做了一些不同的事情,只是将dataType设置为'json'?

3 个答案:

答案 0 :(得分:3)

服务器需要JSON字符串,而不是表单参数。 JSON.stringify将您的表单参数对象/数组转换为JSON字符串,这是您的服务器所期望的。

答案 1 :(得分:3)

它仍在第二次尝试发送请求;只是你的服务器不理解请求。这是因为jQuery在发送数据之前会自动将formValues数据处理为查询字符串。见the documentation

  

数据

     

类型:对象,字符串

     

要发送到服务器的数据。它是   转换为查询字符串,如果还不是字符串。它附加到   GET请求的URL。请参阅processData选项以防止这种情况   自动处理。对象必须是键/值对。如果价值是   Array,jQuery使用相同的密钥序列化多个值   传统环境的价值(如下所述)。

因此,您必须使用JSON.stringify(),或者不使用JSON。请注意,将processData设置为false无济于事,因为它只会将字符串[object Object]发送到您的服务器。另请参阅this question

答案 2 :(得分:0)

$.param()怎么样?

var my_data = {};
my_data.post_name = 'post_value';
$.ajax({
    url:'/post_url.php'
    data:$.param(my_data);
    ...
});