REST API: Object not found

Всё что касается построения API
reireirei
Сообщения: 22
Зарегистрирован: 2018.12.18, 11:20

REST API: Object not found

Сообщение reireirei »

Пытаюсь запустить rest api, но всё время вылазит ошибка object not found... Как-будто что-то не так в правилах urlManager, но с виду вроде всё верно...
Структура каталога следующая:
-api
–confing
–web
–modules
—v1
----controllers
----models
—Module.php

api/config/main-local.php:

Код: Выделить всё

 /*..................*/
    '    urlManager' => [
                'enablePrettyUrl' => true,
                'enableStrictParsing' => true,
                'showScriptName' => false,
                'rules' => [
                    [
                        'class' => \yii\rest\UrlRule::class,
                        'controller' => ['v1/user'],
                        'prefix' => 'api',
                        'extraPatterns' => [
                            'GET /' => 'test',
                        ],
                    ],
                ],
            ], 
/*..................*/
'modules' => [
    'v1' => [
        'basePath' => '@app/modules/v1',
        'class' => api\modules\v1\Module::class,
    ]
],
Класс модуля:

Код: Выделить всё

namespace api\modules\v1;

    class Module extends \yii\base\Module
{
    /**
     * {@inheritdoc}
     */
    public $controllerNamespace = 'api\modules\v1\controllers';

    /**
     * {@inheritdoc}
     */
    public function init()
    {
        parent::init();

        // custom initialization code goes here
    }
}
Контроллер:

Код: Выделить всё

namespace api\modules\v1\controllers;

use yii\rest\ActiveController;

class UserController extends ActiveController
{
public $modelClass = ‘api\modules\v1\models\User’;

public function actionDefault()
{
    echo 'tesssst';
}

public function actionTest()
{
    return 'tesssst';
}

}
Error handler в main.php работает ( ‘errorAction’ => ‘v1/default/error’,)

Есть Yii::setAlias(’@api’, dirname(dirname(DIR)) . ‘/api’); в common/config/bootstrap.php и parsers стоит ‘application/json’ => ‘yii\web\JsonParser’, в api/config/main-loacal.php

Пробовал писать путь localhost /api/web/v1/user/test, localhost/api/v1/user/test, localhost/api/web/v1/users, localhost/api/v1/users… Всегда ошибка 404.
Не пойму что ещё тут не так...
someweb
Сообщения: 552
Зарегистрирован: 2017.03.09, 10:12

Re: REST API: Object not found

Сообщение someweb »

Код: Выделить всё

public $modelClass = ‘api\modules\v1\models\User’;
Кавычки нормальные поставьте.
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.
reireirei
Сообщения: 22
Зарегистрирован: 2018.12.18, 11:20

Re: REST API: Object not found

Сообщение reireirei »

someweb писал(а): 2019.09.10, 11:37

Код: Выделить всё

public $modelClass = ‘api\modules\v1\models\User’;
Кавычки нормальные поставьте.
Ну вообще там нормальные стоят, это при копировании сюда поломалось просто...
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: REST API: Object not found

Сообщение yiiliveext »

Сначала определитесь с ошибкой. Object not found немного из другой оперы чем 404
Для маршрута localhost/api/v1/users/test (при условии что у вас webroot указыват на папку web)

Код: Выделить всё

 
[
    'class' => '\yii\rest\UrlRule',
    'controller' => ['v1/user'],
    'prefix' => 'api',
    'extraPatterns' => [
        'GET test' => 'test',
    ]
]
reireirei
Сообщения: 22
Зарегистрирован: 2018.12.18, 11:20

Re: REST API: Object not found

Сообщение reireirei »

yiiliveext писал(а): 2019.09.10, 13:12 Сначала определитесь с ошибкой. Object not found немного из другой оперы чем 404
Вот так это выглядит...
Изображение
А правила у меня ровно такие и написаны (разве что urlRule класс не в ковычках, но и сними так же)...
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: REST API: Object not found

Сообщение yiiliveext »

webroot куда указывает?
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: REST API: Object not found

Сообщение yiiliveext »

reireirei писал(а): 2019.09.10, 13:54 А правила у меня ровно такие и написаны (разве что urlRule класс не в ковычках, но и сними так же)...

Код: Выделить всё

[
                        'class' => \yii\rest\UrlRule::class,
                        'controller' => ['v1/user'],
                        'prefix' => 'api',
                        'extraPatterns' => [
                            'GET /' => 'test',
                        ],
                    ],

Код: Выделить всё

[
    'class' => '\yii\rest\UrlRule',
    'controller' => ['v1/user'],
    'prefix' => 'api',
    'extraPatterns' => [
        'GET test' => 'test',
    ]
]
Вы не видите здесь больше различий?
reireirei
Сообщения: 22
Зарегистрирован: 2018.12.18, 11:20

Re: REST API: Object not found

Сообщение reireirei »

yiiliveext писал(а): 2019.09.10, 14:01 webroot куда указывает?
хост/api/web, насколько я понимаю
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: REST API: Object not found

Сообщение yiiliveext »

reireirei писал(а): 2019.09.10, 14:24
yiiliveext писал(а): 2019.09.10, 14:01 webroot куда указывает?
хост/api/web, насколько я понимаю
У вас не доходит запрос, иначе если все настроено по умолчанию вам бы 404 ошибка отдавалась json
reireirei
Сообщения: 22
Зарегистрирован: 2018.12.18, 11:20

Re: REST API: Object not found

Сообщение reireirei »

yiiliveext писал(а): 2019.09.10, 14:28 У вас не доходит запрос, иначе если все настроено по умолчанию вам бы 404 ошибка отдавалась json
У меня в OpenServer папка с yii проектом используется как папка домена... Это какой-то htaccess надо в api/web добавить, не?
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: REST API: Object not found

Сообщение yiiliveext »

Если апи - это единственное приложение, то просто поставьте корень на папку web
reireirei
Сообщения: 22
Зарегистрирован: 2018.12.18, 11:20

Re: REST API: Object not found

Сообщение reireirei »

yiiliveext писал(а): 2019.09.10, 14:43 Если апи - это единственное приложение, то просто поставьте корень на папку web
В api\web\.htaccess добавил DirectoryIndex api/web/index.php, перезапустил сервер и ничего...
И так ещё пробовал..
Изображение
Пробую открывать на хост/api/v1/users, хост/v1/users
Попробовал 'prefix' => 'api', убирать в конфиге, всё равно не работает...
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: REST API: Object not found

Сообщение yiiliveext »

На картинке правильно, htaccess верните в стандартный вид. В файле api\web\index.php закомментируйте все строки и напишите echo 'Test OK';
Ввведите адрес petsore.ru Должно вывести Test OK если точка входа настроена правильно.
reireirei
Сообщения: 22
Зарегистрирован: 2018.12.18, 11:20

Re: REST API: Object not found

Сообщение reireirei »

yiiliveext писал(а): 2019.09.10, 15:52 На картинке правильно, htaccess верните в стандартный вид. В файле api\web\index.php закомментируйте все строки и напишите echo 'Test OK';
Ввведите адрес petsore.ru Должно вывести Test OK если точка входа настроена правильно.
Главная страница работает, выводит текст. Но с REST всё то же самое - object not found
Собсна веб и раньше работал вроде, не работает restful контроллер...
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: REST API: Object not found

Сообщение yiiliveext »

Если главная работает, то откройте petsore.ru/debug и посмотрите, приходит ли этот запрос и что с ним не так.
reireirei
Сообщения: 22
Зарегистрирован: 2018.12.18, 11:20

Re: REST API: Object not found

Сообщение reireirei »

yiiliveext писал(а): 2019.09.11, 08:45 Если главная работает, то откройте petsore.ru/debug и посмотрите, приходит ли этот запрос и что с ним не так.
Пишет, что вьюха не найдена. Я это уже видел ранее... Но мне не вьюхи нужны, а REST в общем-то...
Изображение
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: REST API: Object not found

Сообщение yiiliveext »

Скиньте конфиги и index.php
reireirei
Сообщения: 22
Зарегистрирован: 2018.12.18, 11:20

Re: REST API: Object not found

Сообщение reireirei »

api/web/index.php

Код: Выделить всё

<?php
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');

require __DIR__ . '/../../vendor/autoload.php';
require __DIR__ . '/../../vendor/yiisoft/yii2/Yii.php';
require __DIR__ . '/../../common/config/bootstrap.php';
require __DIR__ . '/../config/bootstrap.php';

$config = yii\helpers\ArrayHelper::merge(
    require __DIR__ . '/../../common/config/main.php',
    require __DIR__ . '/../../common/config/main-local.php',
    require __DIR__ . '/../config/main.php',
    require __DIR__ . '/../config/main-local.php'
);

(new yii\web\Application($config))->run();
api/config/main-local.php

Код: Выделить всё

<?php

$config = [
    'components' => [
        'request' => [
            // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation
            'cookieValidationKey' => 'H-Ro9pHYgrkwD7suTTgMBydtP0Cp-kS_',
            'parsers' => [
                'application/json' => 'yii\web\JsonParser',
            ]
        ],
        //'bootstrap' => ['v1'],
        'urlManager' => [
            'enablePrettyUrl' => true,
            'enableStrictParsing' => true,
            'showScriptName' => false,
            'rules' => [
                [
                    'class' => \yii\rest\UrlRule::class,
                    'controller' => ['v1/user'],
                    'prefix' => 'api',
                    'extraPatterns' => [
                        'GET /' => 'test',
                    ],
                ],
            ],
        ],
    ],
    'modules' => [
        'v1' => [
            'basePath' => '@app/modules/v1',
            'class' => api\modules\v1\Module::class,
        ]
    ],
];

if (!YII_ENV_TEST) {
    // configuration adjustments for 'dev' environment
    $config['bootstrap'][] = 'debug';
    $config['modules']['debug'] = [
        'class' => 'yii\debug\Module',
    ];

    $config['bootstrap'][] = 'gii';
    $config['modules']['gii'] = [
        'class' => 'yii\gii\Module',
    ];
}

return $config;
api/config/main.php

Код: Выделить всё

<?php
$params = array_merge(
    require __DIR__ . '/../../common/config/params.php',
    require __DIR__ . '/../../common/config/params-local.php',
    require __DIR__ . '/params.php',
    require __DIR__ . '/params-local.php'
);

return [
    'id' => 'app-api',
    'basePath' => dirname(__DIR__),
    'controllerNamespace' => 'api\controllers',
    'bootstrap' => ['log'],
    'modules' => [],
    'components' => [
        'request' => [
            'csrfParam' => '_csrf-api',
            'csrfCookie' => [
                'httpOnly' => true,
            ]
        ],
        'user' => [
            'identityClass' => 'common\models\User',
            'enableAutoLogin' => true,
            'identityCookie' => ['name' => '_identity-api', 'httpOnly' => true],
        ],
        'session' => [
            // this is the name of the session cookie used for login on the api
            'name' => 'advanced-api',
        ],
        'log' => [
            'traceLevel' => YII_DEBUG ? 3 : 0,
            'targets' => [
                [
                    'class' => 'yii\log\FileTarget',
                    'levels' => ['error', 'warning'],
                ],
            ],
        ],
        'errorHandler' => [
            'errorAction' => 'v1/default/error',
        ],

        'urlManager' => [
            'enablePrettyUrl' => true,
            'enableStrictParsing' => true,
            'showScriptName' => false,
            'rules' => [
                ['class' => \yii\rest\UrlRule::class,
                'controller' => ['v1/user'],
                'prefix' => 'api'],
            ],
        ],

    ],
    'params' => $params,
];
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: REST API: Object not found

Сообщение yiiliveext »

api/config/main-local.php

Код: Выделить всё

<?php

$config = [
    'components' => [
        'request' => [
            // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation
            'cookieValidationKey' => 'H-Ro9pHYgrkwD7suTTgMBydtP0Cp-kS_',
            'parsers' => [
                'application/json' => 'yii\web\JsonParser',
            ]
        ],
        //'bootstrap' => ['v1'],

    ]
];

if (!YII_ENV_TEST) {
    // configuration adjustments for 'dev' environment
    $config['bootstrap'][] = 'debug';
    $config['modules']['debug'] = [
        'class' => 'yii\debug\Module',
    ];

    $config['bootstrap'][] = 'gii';
    $config['modules']['gii'] = [
        'class' => 'yii\gii\Module',
    ];
}

return $config;
api/config/main.php

Код: Выделить всё

<?php
$params = array_merge(
    require __DIR__ . '/../../common/config/params.php',
    require __DIR__ . '/../../common/config/params-local.php',
    require __DIR__ . '/params.php',
    require __DIR__ . '/params-local.php'
);

return [
    'id' => 'app-api',
    'basePath' => dirname(__DIR__),
    'controllerNamespace' => 'api\controllers',
    'bootstrap' => ['log'],
    'modules' => [
        'v1' => [
            'basePath' => '@app/modules/v1',
            'class' => api\modules\v1\Module::class,
        ]
    ],
    'components' => [
        'request' => [
            'csrfParam' => '_csrf-api',
            'csrfCookie' => [
                'httpOnly' => true,
            ]
        ],
        'user' => [
            'identityClass' => 'common\models\User',
            'enableAutoLogin' => true,
            'identityCookie' => ['name' => '_identity-api', 'httpOnly' => true],
        ],
        'session' => [
            // this is the name of the session cookie used for login on the api
            'name' => 'advanced-api',
        ],
        'log' => [
            'traceLevel' => YII_DEBUG ? 3 : 0,
            'targets' => [
                [
                    'class' => 'yii\log\FileTarget',
                    'levels' => ['error', 'warning'],
                ],
            ],
        ],
        'errorHandler' => [
            'errorAction' => 'v1/default/error',
        ],

        'urlManager' => [
            'enablePrettyUrl' => true,
            'enableStrictParsing' => true,
            'showScriptName' => false,
            'rules' => [
                [
                    'class' => \yii\rest\UrlRule::class,
                    'controller' => ['v1/user'],
                    'prefix' => 'api',
                    'extraPatterns' => [
                        'GET /' => 'test',
                    ],
                ],
            ],
        ],

    ],
    'params' => $params,
];
api/modules/v1/controllers/UserController.php

Код: Выделить всё

<?php

namespace api\modules\v1\controllers;

use yii\rest\ActiveController;

/**
 *  UserController
 */
class UserController extends ActiveController
{
    public $modelClass = 'app\modules\v1\models\User';
   

    public function behaviors()
    {
        $behaviors = parent::behaviors();
        
        $behaviors['corsFilter'] = [
            'class' => \yii\filters\Cors::className(),
            'cors' => [
                'Origin' => ['*'],
                'Access-Control-Request-Method' => ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],
                'Access-Control-Request-Headers' => ['*'],
            ],
        ];
        $behaviors['contentNegotiator'] = [
            'class' => \yii\filters\ContentNegotiator::className(),
            'formats' => [
                'application/json' => \yii\web\Response::FORMAT_JSON,
            ],
        ];

        return $behaviors;
    }

    public function actionTest()
    {
        return 'test Ok';
    }

}
api/web/.htaccess

Код: Выделить всё

RewriteEngine on


# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# otherwise forward it to index.php
RewriteRule . index.php
В браузере: http://petstore.ru/api/v1/users
reireirei
Сообщения: 22
Зарегистрирован: 2018.12.18, 11:20

Re: REST API: Object not found

Сообщение reireirei »

Чёт не работает...
Попробовал controllerNamespace' => 'api\v1\controllers' поставить вместо api\controllers и $modelClass у меня api\modules\..... остальное заменил.
Корень в api/web остался.
Ещё в common\config\bootsrap.php у меня был прописан алиас Yii::setAlias('@api', dirname(dirname(__DIR__)) . '/api'); хотя это не важно наверное..

upd: а, htaccess попробую щас..
Ответить