Рестлер всегда возвращает 404: не найден

Я установил 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();

Я предполагаю, что есть некоторая неправильная конфигурация вокруг, но я действительно не могу понять, что не так.

(Я также попробовал некоторые решения на Stackru, но они, похоже, не работают для меня)

Редактировать:

Я попытался достичь примера, используя следующий путь http://localhost/myproject/resources/engine/library/restler/public/examples и они работают, так что я думаю, что это связано с конфигурацией самого Рестлера, потому что он, кажется, не работает в http://localhost/myproject/api,

Кроме того, я также попытался скопировать Restler Explorer в http://localhost/myproject/api/explorer и я продолжаю получать сообщение об ошибке: 404 : Not Found ../resources.json вероятно, потому что я не установил Рестлер в корневую папку моего проекта. Как мне установить 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 это не так

В этот момент я потерял всякую надежду и мне действительно нужна помощь, потому что я действительно что-то упускаю, но не могу догадаться, что:(HELP!

1 ответ

Решение

Вот как вы можете отлаживать и находить что не так,

  • Удалите пространство имен в api.php. Это не обязательно и вызовет проблемы.

  • Скопируйте папку обозревателя в /myproject/api папку и добавить класс ресурсов в качестве класса API

    $restler->addApiClass('Resources'); //this produces the needed resources.json
    
  • Если вы добавляете класс User с пространством имен, убедитесь, что он определен в этом пространстве имен и доступен для ваших операторов включения или автозагрузчика.

  • Вы можете создать /myproject/api/cache папку и сделать ее доступной для записи. Когда вы создаете экземпляр restler в производственном режиме с обновлением кеша, как показано ниже, он создаст route.php в папке кеша, которая перечисляет всю информацию о маршрутах

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

Надеюсь, вы найдете, что не так с выше

Убедитесь, что ваша функция public не private.

На самом деле у меня была такая же проблема, и я потратил час на ее выяснение (facepalm).

Другие вопросы по тегам