使用jQuery 1.7 AJAX POST报405错误,请求自动转为GET的问题排查
问题分析与解决方案
这个问题的核心是jQuery版本差异导致的AJAX参数不兼容,具体拆解如下:
问题原因
- 请求方法参数不兼容:jQuery 1.7版本并不支持
method这个参数来指定请求类型——method是jQuery 1.9之后才引入的type参数别名。你代码里写的"method": "POST"在1.7中会被直接忽略,AJAX请求会默认使用GET方法,这就是为什么你看到实际发送了GET请求,触发了405 Method Not Allowed错误。 - CORS错误的连锁反应:因为请求意外变成了GET,而目标端点的CORS配置只允许POST请求,所以服务器没有返回
Access-Control-Allow-Origin响应头,导致浏览器拦截了请求,出现对应的跨域错误。
解决建议
针对jQuery 1.7的特性,需要对AJAX配置做两处关键修改:
1. 替换method为type
把配置里的"method": "POST"改成"type": "POST",这是jQuery 1.7指定请求方法的标准参数。
2. 优化JSON数据的处理(可选但推荐)
手动拼接JSON字符串容易出现语法错误,建议先构建JavaScript对象,再用JSON.stringify()转换为字符串,同时设置processData: false——告诉jQuery不要自动把data转换为查询字符串(旧版本默认会这么做,导致JSON被当成GET参数拼接在URL后)。
修改后的完整代码
var token = getCookie('hubspotutk'); //Get the users cookie var pageTitle = document.title; //Title of page var pageURL = document.URL; //URL of page var submissionTime = new Date().getTime(); //Get time in milliseconds to record submission var formData = $(this).serializeArray(); //Get the form data and convert to an array // 先构建对象,避免手动拼接JSON的语法错误 var requestData = { "submittedAt": submissionTime, "fields": formData, "context": { "hutk": token, "pageUri": pageURL, "pageName": pageTitle }, "skipValidation": true }; //Define settings for AJAX request var settings = { "url": "https://api.hsforms.com/submissions/v3/integration/submit/xxxx/xxxxxx/", //FORM API ENDPOINT "type": "POST", // 替换method为type "headers": {"Content-Type": "application/json","cache-control": "no-cache"}, "data": JSON.stringify(requestData), // 用对象转JSON "processData": false // 禁止jQuery自动处理数据格式 } $.ajax(settings).done(function(response) { console.log(response); //Output the response });
额外说明
processData: false的作用:默认情况下jQuery会把data中的对象或字符串转换为application/x-www-form-urlencoded格式的查询字符串,但我们需要发送JSON格式的请求体,所以必须禁用这个行为。- 确认目标端点确实允许POST请求的CORS,解决请求方法问题后,正常情况下应该能获取到正确的
Access-Control-Allow-Origin响应头了。
内容的提问来源于stack exchange,提问作者Javacadabra
相关产品推荐
相关产品推荐

