【问题标题】:always_populate_raw_post_data - Trouble accessing request payload from Backbone createalways_populate_raw_post_data - 无法从 Backbone 创建访问请求有效负载
【发布时间】:2015-04-01 10:56:43
【问题描述】:

我正在尝试使用 Backbone.js 以 REST 方式将集合保存到我的数据库中,并在我的服务器上运行 SLIM php 框架。

这是我的收藏:

var newUser = this.collection.create(
    formData,
    {
        wait: true,
        success: $.proxy(function() {
            this.collection.currentUser = newUser;
            App.Router.navigate('', { trigger: true });
        }, this)
    }
);

这是我的 SLIM 路线:

$api->post('/users', function() use($api, $db) {

    $request = $api->request()->post();

    $api->response()->header('Content-Type', 'application/json');

    $result = $db->users()->insert($user);

    if( $result ) {
        echo json_encode(array(
            'id' => $result['id']
        ));
    }
    else {
        echo json_encode(array(
            'status' => false,
            'message' => 'error_creating_user'
        ));
    }

});

$api->run();

在我的集合上调用 create() 时,我在服务器的响应中收到弃用警告:

Automatically populating $HTTP_RAW_POST_DATA is deprecated and will be removed in a future version. To avoid this warning set 'always_populate_raw_post_data' to '-1' in php.ini and use the php://input stream instead. in Unknown on line 0

我已按照这些说明进行了以下操作:

我在路线之前添加了这个:

ini_set('always_populate_raw_post_data', '-1');

在我的 POST 路由中,我尝试像这样接收请求负载:

$request = file_get_contents('php://input');

对我的代码进行此更改后,我得到的响应保持不变...

编辑

即使回调为空,也会发生错误......

$api->post('/users', function() use($api, $db) {

    // nothing

});

【问题讨论】:

标签: php backbone.js xmlhttprequest slim postdata


【解决方案1】:

您可以通过来自 Slim 的请求对象来请求 POST 数据。

$api->post('/users', function() use ($api) {
    var_dump($api->request()->post());
    var_dump($api->request()->post('specificKey'));
});

这是文档:http://docs.slimframework.com/#Request-Variables

【讨论】:

  • 不幸的是,即使使用 SLIM 的请求对象,错误仍然存​​在。尽管路由的回调函数为空,但它实际上会发生。查看我的编辑。
【解决方案2】:

PHP 5.6 中有一个错误。 always_populate_raw_post_data的默认值是0。即使您的代码不使用$HTTP_RAW_POST_DATA,这也会导致PHP 抛出警告。一些人声称在某些文本已经输出后调用header() 时会发生这种情况。尝试使用ini_set()没有帮助。

您必须直接在 php.ini 中更改配置。

always_populate_raw_post_data = -1

PHP 内部的相关discussion

【讨论】:

  • 谢谢。似乎是这个问题。目前,由于我的代码并不特别需要 5.6,因此我已将 5.6 版本切换回 5.5,问题就消失了。
【解决方案3】:

基本上你可以通过几种方式解决Automatically populating $HTTP_RAW_POST_DATA is deprecated...错误,

  1. PHP 设置

将 always_populate_raw_post_data 更改为 -1 php.ini 文件将解决此问题。但是,如果您没有足够的控制 php.ini 文件,就会出现问题。您可以考虑共享主机。

  1. Apache 设置

将 .htaccess 文件更改为您的应用程序目录。这将仅对您的应用程序进行隔离控制。它不会影响其他应用程序执行的 APACHE 和 PHP。

<IfModule mod_php5.c> php_value always_populate_raw_post_data -1 </IfModule>

我会推荐第二种方法。因为它允许您将应用程序放置在共享托管和专用服务器托管中。

【讨论】:

  • 是的,你说得对!第二种方法更便携
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多