【问题标题】:JSON data not being sent in POST?JSON数据没有在POST中发送?
【发布时间】:2012-12-24 15:40:12
【问题描述】:

我正在构建一个 AJAX 表单,并尝试通过 JSON 发送 3 个字段。

客户端,表单被序列化并输入JSON格式:

$('#form-signin').live('submit', function(event) {
    var target = $('#ajax');
    var url = '/ajax/user/authenticateLevel2';

    $.ajax({

        type: "POST",
        url: url,
        data: $.base64.encode($('#form-signin').serialize()),
        dataType: 'json',

        success: function(data, status) {
            $.getJSON(url, function(data) {
                $('#ajax').html($.base64.decode(data.html));
                $('#ajax').modal();
            });
        }
    });
    event.preventDefault();
});

服务器端,我的路由器拆分 URL 请求,发现第一部分包含“ajax”,然后继续将路由请求专门传递给 AJAX 处理程序。

我的问题是,即使在路由器内部,检查用于获取帖子信息的$_REQUEST,帖子数据也不存在。 $_POST 也是如此。

即使是请求命中的第一页 (index.php),$_REQUEST 也没有数据。

我做错了什么?

服务器端,

请求被发送到包含 Autoloader 和 init 脚本的 index.php。

init 脚本初始化数据库连接,设置错误、异常和会话处理,然后将请求传递到路由器。

路由器,在其构造方法中:将URL设置为数组(爆破$_SERVER['REQUEST_URI']),然后设置相关的控制器、方法和附加参数。

在这种情况下,由于我们正在执行 ajax 请求,因此在我们发送请求之前会发生特殊处理。

方法参数设置为:

    $requestParams = $_REQUEST;
    unset($requestParams['url']);

此请求参数以及附加信息(url、控制器、方法和数据库对象)被传递以进行调度。

在所有情况下,我们主要使用这种方法进行调度:

            $dispatchedController = new $this->controller($this->database);
            $method = $this->method;

            return $dispatchedController->$method($this->params);

【问题讨论】:

    标签: php javascript jquery ajax json


    【解决方案1】:

    如果我记得很久以前使用插件时,$.base64.encode() 方法返回一个字符串,所以您发送到服务器的可能是一个没有值的单个参数。

    我相信你应该做类似的事情

    data: "foo=" + $.base64.encode($('#form-signin').serialize()),
    

    【讨论】:

      【解决方案2】:

      您不只是将 json 发送到服务器,只是一个 base64 编码的字符串。您还期望密钥/对值。要发送键/对值,只需将序列化的表单数据传递给 $.ajax 函数。

      $('#form-signin').live('submit', function(event) {
          var target = $('#ajax');
          var url = '/ajax/user/authenticateLevel2';
          $.ajax({
              type: "POST",
              url: url,
              data: $('#form-signin').serialize(),
              dataType: 'json',
              success: function(data, status) {
                  $.getJSON(url, function(data) {
                      $('#ajax').html($.base64.decode(data.html));
                      $('#ajax').modal();
                  });
              }
          });
          event.preventDefault();
      });
      

      【讨论】:

        【解决方案3】:

        代码应该可以工作(假设您的 HTML 不是这里的问题,例如,'#form-signin' 是正确表单的正确选择器)。

        您提到您无法在服务器端获取数据。但是,您确定您甚至可以从客户端发送您需要的数据吗?例如,您是否使用 Firebug 等工具分析过请求?

        【讨论】:

        • 是的,萤火虫在标头中看到了 json,所以它肯定是在客户端发送的。即使解码 JSON 字符串,我也会得到我输入的表单输入。
        • @Shamil 听起来你应该发布你的服务器端代码,因为客户端正在做应该做的事情。
        • 我在OP中添加了流程的基本描述。
        猜你喜欢
        • 2021-09-09
        • 2022-11-19
        • 1970-01-01
        • 2019-01-06
        • 2016-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多