【问题标题】:406-Not Acceptable Response - jQuery AJAX406-不可接受的响应 - jQuery AJAX
【发布时间】:2014-09-27 06:31:00
【问题描述】:

当我通过 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

回复

false

当请求失败时,它甚至不会进入 process_form 函数来打印出 POST 数组。


但是,当我将问题中的“创建值”字符串修改为“创建 a 值”之类的内容时,表单提交成功。我唯一能想到的是服务器层(GoDaddy)上的一些 SQL 注入预防检测,但我不确定如何解决这个问题。

当 Content-Type 显然不是问题时,可能导致 406 错误的原因。

【问题讨论】:

  • 您必须首先查明问题所在。您的 json 有时格式错误或不包含后端所需的内容,或者后端有问题。
  • 您能否分享触发 AJAX 请求的代码以及后端处理的代码?
  • 您是否尝试删除 dataType: 'json' 并提交其他任何内容以检查它是否有效?这样你就可以确定它是 json 还是其他东西。
  • process_form 被称为 process_form() 吗?
  • @guest271314 - 这是 Web 服务,因此基于 URL 调用 process_form()。

标签: php jquery http-status-code-406


【解决方案1】:

使用 jQuery AJAX 时出现 406 Not Acceptable 错误 原来问题是我正在使用 POST 提交 ajax 请求 方法,但实际上并未发送任何发布数据。例如:

  $.ajax({
   type: "POST",
   url: "index.php?action=foo",
   success: function(msg){
 
    }
  });

【讨论】:

    【解决方案2】:

    可能是标题问题。尝试将此添加到您的$.ajax():

    headers: { 
        Accept : "application/json"
    }
    

    【讨论】:

      【解决方案3】:

      试试

      在处理表单页面的 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 success 和 406 statusCode 错误。

      【讨论】:

        【解决方案4】:

        问题是您以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
        });
        

        【讨论】:

        • 您是否在 PHP 站点上使用任何特定的框架?应该导致process_form() 的调用堆栈是什么?什么是新的请求标头和完整的响应标头? (请使用此信息更新问题)
        【解决方案5】:

        这可能是由名为mod_security 的模块引起的,它可能会导致此问题。你的代码对我来说看起来不错。因此,请检查您的主机,查看是否安装并启用了 mod_security,如果是,请尝试暂时禁用它,然后再次测试此代码。如果mod_security 不是罪魁祸首,别忘了重新启用它。

        【讨论】:

        • 我正在与 GoDaddy 合作,看看他们是否可以禁用此设置。更多信息即将发布。
        • 如果我的服务器不允许禁用此类模组,我该怎么办?比如hostgator
        【解决方案6】:

        尝试将 AJAX 调用的类型从 POST 类型更改为 GET。它可能会对你有所帮助。

        【讨论】:

        • 这是不可能的,因为问题的数量可以是动态的,并且不想担心达到 URL 字符限制。
        【解决方案7】:

        您所描述的症状是您的网络主机设置的网络应用程序防火墙的特征。请联系他们的支持部门。

        【讨论】:

          猜你喜欢
          • 2015-05-17
          • 2013-03-18
          • 2011-11-20
          • 1970-01-01
          • 2012-12-24
          • 2019-09-01
          • 2018-11-22
          • 1970-01-01
          相关资源
          最近更新 更多