当我通过jQuery AJAX函数将JSON数据对象发送到后端服务时,我收到406错误,因此数据可以存储到数据库中。
AJAX功能
data = {
questions: questions,
test_id: test_id,
action: 'update'
};
gmtjax({
url: gmt.contextPath + 'tests/questions/process_form',
type: 'POST',
data: data,
dataType: 'json',
$spinner: gmt.$spinnerContainer,
success: function(returnData) {
console.log('success');
},
error: function(){
//console.log('error');
},
$errorContainer: gmt.$mainContainer
});
JSON结构:
{
"test_id": "1",
"action": "update",
"questions": [
{
"question": "Exploitation strategies seek to create value from unfamiliar resources and activities.",
"options": [
{
"name": "True"
},
{
"name": "False"
}
]
}
]
}
流程表格功能(后端)
function process_form(){
print_r($_POST);
}
当我提交数据时,XHR请求中的STATUS CODE是406 Not Acceptable。
请求标题
Accept:application/json, text/javascript, */*; q=0.01
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8,af;q=0.6,ms;q=0.4
Cache-Control:no-cache
Connection:keep-alive
Content-Length:1726
Content-Type:application/x-www-form-urlencoded; charset=UTF-8
Cookie:ci_session=08c62699d06dfcf8ba853cacb350ab3b
Host:testingsite.com
Origin:https://testingsite.com
Pragma:no-cache
Referer:https://testingsite.com/tests/manage/id/194/goto/2
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36
X-Requested-With:XMLHttpRequest
RESPONSE
false
当请求失败时,它甚至不会输入process_form函数来打印出POST数组。
但是,当我将问题中的“创建值”字符串修改为“创建 a 值”时,表单会成功提交。我唯一能想到的是服务器层(GoDaddy)上的一些SQL注入预防检测,但我不确定如何解决这个问题。
当Content-Type显然不是问题时,可能导致406错误的原因。
答案 0 :(得分:2)
可能是由名为mod_security
的模块引起的,它可能导致此问题。你的代码看起来很好。因此,请检查您的主机,查看是否已安装并启用mod_security
,如果是,请尝试暂时禁用它,然后再次测试此代码。如果mod_security
不是罪魁祸首,请不要忘记重新启用它。
答案 1 :(得分:2)
问题是您要将帖子数据发送为application/x-www-form-urlencoded
,而您的服务可能需要application/json
。尝试发送实际的JSON:
gmtjax({
url: gmt.contextPath + 'tests/questions/process_form',
type: 'POST',
data: JSON.stringify(data),
contentType: "application/json",
dataType: 'json',
$spinner: gmt.$spinnerContainer,
success: function(returnData) {
console.log('success');
},
error: function(){
//console.log('error');
},
$errorContainer: gmt.$mainContainer
});
答案 2 :(得分:1)
尝试
在流程表单页面的php结束时
echo print_r($_POST);
在success
回拨
console.log(returnData);
如果请求,响应成功,应该返回
Array
(
[test_id] => 1
[action] => update
[questions] => Array
(
[0] => Array
(
[question] => Exploitation strategies seek to create value from unfamiliar resources and activities.
[options] => Array
(
[0] => Array
(
[name] => True
)
[1] => Array
(
[name] => False
)
)
)
)
)
1
在error
回拨
error : function(jqxhr, textStatus, errorThrown) {
console.log(textStatus, jqxhr.getAllResponseHeaders()
, errorThrown)
}
在ajaxSetup
$.ajaxSetup({
statusCode : {
200 : function (data, textStatus, jqxhr) {
console.log(data);
},
406 : function (jqxhr, textStatus, errorThrown) {
console.log(textStatus + "\n" + errorThrown);
}
}
});
尝试记录200
成功,406
statusCode错误。
答案 3 :(得分:0)
您所描述的症状是Web主机实施的Web应用程序防火墙的特征。联系他们的支持部门。
答案 4 :(得分:0)
尝试将POST类型的AJAX调用类型更改为GET。它可能会对你有帮助。
答案 5 :(得分:0)
可能是标题问题。尝试将其添加到$.ajax()
:
headers: {
Accept : "application/json"
}
答案 6 :(得分:0)
使用 jQuery AJAX 时出现 406 Not Acceptable 错误 原来问题是我正在使用 POST 提交 ajax 请求 方法,但实际上并未发送任何发布数据。例如:
$.ajax({
type: "POST",
url: "index.php?action=foo",
success: function(msg){
}
});