在ajax调用上缺少参数

时间:2015-04-08 12:46:31

标签: javascript jquery arrays ajax

我有这段代码:

    jQuery('#send-visitor-'+postId).on('click', function() {

        console.log(ratingArray); //just to be sure

        var data = {

            action: 'send_rating',
            nonce: nonce, 
            post_id: postId,
            rating: ratingArray,
            set_type: setType

        }

        console.log(data);

        //Send value to the Server
        jQuery.post(ajaxurl, data, function(response) {
            //console.log(response);
        });

    });

ratingArray存在,我确定,我可以通过console.log看到它 然后,我做console.log(data.rating),一切都很好。

但是当我使用jQuery.post发送数据var时,除非评级,否则发送所有参数。

1 个答案:

答案 0 :(得分:2)

发送到服务器的数据的默认编码为application/x-www-form-urlencoded; charset=UTF-8。在data选项的the documentation中,它显示:

  

数据

     

键入:PlainObject或String或Array

     

要发送到服务器的数据。如果不是字符串,它将转换为查询字符串。它附加到GET请求的URL。请参阅processData选项以防止此自动处理。 对象必须是键/值对。

(我的重点)

这意味着您的ratingArray可能正在转换为字符串,以便在发送到服务器时用作键/值对中的值。您还没有说明ratingArray的内容是什么,但除非它们可以通过默认的Array#toString有意义地转换为字符串,否则这可能是一个问题。在9月份,如果服务器期望的不是数据的字符串版本,它可能不会正确地反序列化rating

您有几个选择:

  1. 自行将ratingArray变为字符串,格式是服务器希望查看rating参数的格式,然后转回数组。

  2. 以JSON而不是URI编码的表单参数发送数据。 您的服务器代码/配置必须具备预期效果。为此,您需要在通话中指定contentType: 'json'更新服务器代码/ config来处理它)。客户端的部分看起来像这样:

    $.ajax({
      type: "POST",
      url: ajaxurl,
      data: JSON.stringify(data),
      contentType: 'json',
      success: function(response) {
        // ...
      }
    });
    

    再次,还需要进行服务器端更改。

  3. 使用默认编码将数据作为单个表单字段发送,使该单个字段的值为JSON字符串。然后在服务器端处理代码中检索该单个值,反序列化JSON,并使用结果。这有时比#2简单一些。客户端部分看起来像这样:

    jQuery.post(ajaxurl, {data: JSON.stringify(data), function(response) {
        //console.log(response);
    });
    

    ...然后服务器将从data POST参数获取字符串,从JSON反序列化它,并使用它。