Restler始终返回404:未找到

时间:2013-12-10 07:48:10

标签: php .htaccess restler

我在本地服务器上安装了Restler来测试并为我的项目制作一些API。

Api请求通过http://localhost/myproject/api/处理。

问题是,每当我尝试发出请求时,我都会收到以下错误:

{
    "error": {
        "code": 404,
        "message": "Not Found"
    },
    "debug": {
        "source": "Routes.php:383 at route stage",
        "stages": {
            "success": [
                "get"
            ],
            "failure": [
                "route",
                "negotiate",
                "message"
            ]
        }
    }
}

这也是我的.htaccess

RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^api(.*)$ /myproject/api/api.php [QSA,L]

这就是api.php的样子:

namespace myproject;

use Luracast\Restler\Restler;

require_once($_SERVER["DOCUMENT_ROOT"]."/myproject/resources/engine/settings.php");
require_once(Settings\Path\Absolute::$library."/restler/vendor/restler.php");

$restler = new Restler();
$restler->addAPIClass("myproject\\User");
$restler->handle();

我猜周围有一些误配,但我真的无法弄清楚是什么问题。

(我也尝试过Stackoverflow上的一些解决方案,但它们似乎对我不起作用)

修改

我尝试使用以下路径http://localhost/myproject/resources/engine/library/restler/public/examples来访问该示例并且它们正在运行,所以我想它与Restler本身的配置有关,因为它似乎不适用于http://localhost/myproject/api

此外我还尝试在http://localhost/myproject/api/explorer中复制Restler Explorer并且我一直收到错误:404 : Not Found ../resources.json可能是因为我没有在项目的根文件夹中安装Restler。我怎么能在不同的子文件夹中安装Restler?

编辑2: 我刚将以下类移到示例001文件夹中:

class User {

    function data() {

        return "HELLO!";
    }
}

并将此行添加到示例的index.php中:

$r->addAPIClass('User');

如果我尝试在.../_001_helloworld/index.php/say/hello运行示例,它可以正常运行,但如果我尝试_001_helloworld/index.php/user/data则不行。

此时我已经失去了所有希望,我真的需要帮助'因为我真的错过了什么,但实在无法猜到:( 帮助!

2 个答案:

答案 0 :(得分:2)

以下是调试和查找错误的方法,

  • 删除api.php中的命名空间。这不是必需的,会导致问题。

  • 将资源管理器文件夹复制到/myproject/api文件夹,并将Resources类添加为api类

    $restler->addApiClass('Resources'); //this produces the needed resources.json
    
  • 如果要添加带有命名空间的User类,请确保在该命名空间下定义该类,并使其与include语句或自动装载器一起使用。

  • 您可以创建/myproject/api/cache文件夹并使其可写。当您使用缓存刷新在生产模式下实例化restler时,如下所示,它将在缓存文件夹中创建routes.php,其中列出了所有路由信息

    $restler = new Restler(true,true); //production_mode, refresh
    

希望你能找到上述

的错误

答案 1 :(得分:0)

检查以确保您的功能是public而不是private

我实际上也遇到了同样的问题,花了一个小时弄清楚了(facepalm)。