无法在REST服务器上获取请求标头

时间:2014-11-12 21:26:37

标签: php slim

我使用Slim Framework作为API。我正在向它发出GET请求。但我无法获得标题。我的PHP文件如下:

    require 'Slim/Slim.php';
    $app = new Slim();
    $app->get('/project/:id', add_authorize(), 'getProject');
    $app->run();
    function getProject($project_title) {
        //connect to database and return project details
    }

    function add_authorize() {
        return function (){
        $app = Slim::getInstance();     
        $charset = $app->request->headers->get('ACCEPT_CHARSET');
        };
    }

我收到回复:

( ! ) Fatal error: Cannot access protected property Slim::$request in C:\wamp\www\server\device_api\index.php on line 23
Call Stack
#   Time    Memory  Function    Location
1   0.0010  248528  {main}( )   ..\index.php:0
2   0.0240  860056  Slim->run( )    ..\index.php:9
3   0.0240  878816  Slim_Route->dispatch( ) ..\Slim.php:1052
4   0.0240  878864  call_user_func:{C:\wamp\www\server\device_api\Slim\Route.php:387} ( )   ..\Route.php:387
5   0.0240  878944  {closure:C:\wamp\www\server\device_api\index.php:19-25}( )  ..\Route.php:387

我已经尝试了一切,但无济于事。我也尝试直接使用标题:

$device_id = $_SERVER['HTTP_DEVICE_ID'];

但这也失败了。我有什么想法可以获得标题吗?

3 个答案:

答案 0 :(得分:1)

不确定是否因为您的PHP版本/ Slim版本。这是我的composer.json文件:

"require": {
    "slim/slim": "2.3.*"
}

我在Mac OSX Yosemite上使用PHP 5.5.14。但无论如何,试试这个:

// closure callback
function getProject($id)
{
    // connect to database and return project details
    // var_dump($id);
}

// act as a middleware, the first argument is \Slim\Route
function addAuthorize($route)
{
    // var_dump($route); // \Slim\Route

    $app = Slim::getInstance();
    $request = $app->request();

    $charset = $request->headers->get('ACCEPT_CHARSET');
}

$app->get('/project/:id', 'addAuthorize', 'getProject');

// Turn on the light
$app->run();

答案 1 :(得分:0)

我建议执行以下操作,而不是将内容包装在闭包中:

require 'Slim/Slim.php';
$app = new Slim();
$app->get('/project/:id', add_authorize(), 'getProject');
$app->run();
function getProject($project_title) {
    //connect to database and return project details
}

function add_authorize() use ($app) {
    $charset = $app->request->headers->get('ACCEPT_CHARSET');
}

答案 2 :(得分:0)

问题是你正试图获得像这样的HTTP标头

$app->request->headers->get('ACCEPT_CHARSET');

这在Slim版本2.x之后有效。你可能有一个以前的版本,比如1.x。

以前访问HTTP标头的方法是这样的,没有getter:

$app->request->headers('ACCEPT_CHARSET');

您可以在代码中更改它,或者转移到新版本的Slim。

这里的示例是版本1.6.7的Slim Documentation https://github.com/codeguy/Slim/blob/1.6.7/docs/request-headers.markdown