在第500个用户中大约一次发送GET请求而不是POST

时间:2014-09-12 13:34:24

标签: jquery ajax post get

我们使用以下AjaxSetup:

$.ajaxSetup(
{
    cache: false,
    type: 'POST',
    contentType: "application/json",
    data: "{}",
    headers: { "Accept": "application/json; charset=utf-8" },
    beforeSend: function(jqXHR, options)
    {
        if ( options.contentType == "application/json" && typeof options.data != "string" )
            options.data = JSON.stringify(options.data);
    },
    processData: false
});

我发送的帖子请求如下:

$.ajax(
{
    url: '/url',
    data: postData,
    success: function(json) 
    {
    }
})

我们使用ASP.NET,这些默认设置通常可以很好地工作。一切都自动同步到JSON,并在我们的ASP.NET管道中正确读取和模型化。

大约一千个用户似乎只有一个问题。他们的客户端发送POST个请求而不是GET请求。

UserAgent在Windows 7上提及Chrome 37.0.2062.120。

Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.120 Safari/537.36

这个客户端发送GET请求的原因是什么?

  • 这可能是由广告拦截器造成的吗?
  • 还是防火墙设置?
  • 我可以追踪哪些其他设置以进一步调查?

1 个答案:

答案 0 :(得分:0)

Boolean的预期回报typeof options.data != "string"是多少?看来条件会返回false? ;可能会向服务器发送一个空对象 - 即使在$.ajax()包含了正确的对象

i.e.g,

尝试

var postData = {"def":789};
$.ajaxSetup(
{
    cache: false,
    type: 'POST',
    contentType: "application/json",
    data: "{}",
    headers: { "Accept": "application/json; charset=utf-8" },
    beforeSend: function(jqXHR, options)
    {
         if ( options.contentType == "application/json" && typeof options.data != "string" )
            options.data = JSON.stringify(options.data);
            console.log(typeof options.data
            , typeof options.data != "string"
            , typeof options.data !== "string") // `string` , `false`, `false`
    },
    processData: false
});
$.ajax("", postData);

如果某种方式将processData选项更改为true,则该请求将成为GET请求,并可能返回error

在没有$.ajaxSetup() data包裹在引号中的情况下尝试,或者投标为string

由于beforeSend会评估

data: "{}"

string并返回false

请参阅network上的console标签;其中postData(对象,Request Payload)呈现为{}:无数据;没有数据发送到服务器。

请参阅http://api.jQuery.com/jquery.ajax

  

processData(默认值:true)类型:Boolean默认情况下,传入的数据   作为对象的数据选项(从技术上讲,除了一个以外的任何东西)   string)将被处理并转换为查询字符串,拟合   到默认内容类型“application / x-www-form-urlencoded”。如果   要发送DOMDocument或其他未处理的数据,请设置此项   选项为false。