REST не работает

Всё что касается построения API
Ответить
Аватара пользователя
porcelanosa
Сообщения: 570
Зарегистрирован: 2010.03.16, 04:31
Откуда: Москва

REST не работает

Сообщение porcelanosa »

Вроде бы простейший пример, который должен работать из коробки.
Прописываем rules в UrlManager

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

// REST for routes
[ 'class' => 'yii\rest\UrlRule', 'controller' => 'routesapi' ],
Пробовала и напрямую прописать

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

[
				'pattern' => 'PUT,PATCH routesapi/update/<id:\d+>',
				'route'   => 'routesapi/update'
			],
В config.php указана настройка для компонента request

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

'request'      => [
                'baseUrl'   => '/admin',
                'csrfParam' => '_csrf-backend',
                'cookieValidationKey' => getenv('COOKIE_VALIDATION_KEY'),
                'parsers' => [
                    'application/json' => 'yii\web\JsonParser',
                ]
            ],
Короче - вот как тут все написано https://www.yiiframework.com/doc/guide/ ... uick-start
Контроллер стандартный REST

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

'update' => [
                    'class'       => 'yii\rest\UpdateAction',
                    'modelClass'  => $this->modelClass,
                    'checkAccess' => [$this, 'checkAccess'],
                    'scenario'    => $this->updateScenario,
                ],
Опять же пробовала и просто

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

        public function actionUpdate($id) {
	        $model = Points::find()->where(['id'=>$id])->one();
	
	        
	        $model->load(\Yii::$app->getRequest()->getBodyParams(), '');
	        if ($model->save() === false && !$model->hasErrors()) {
		        throw new ServerErrorHttpException('Failed to update the object for unknown reason.');
	        }
        	return \Yii::$app->getRequest()->getBodyParams();
        }
Предварительно отключив стандартный update

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

 $actions = parent::actions();
	        unset($actions['update']);
В JS посылаю запрос по адресу site.ru/routesapi/update

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

axios.put(this.appUrl + '/routesapi/update/', point)
point - это js-объект в котором есть id и он уходит нормально - скриншот http://take.ms/TSako
Получаю ошибку

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

code:0
message:"Отсутствуют обязательные параметры: id"
name:"Bad Request"
status:400
type:"yii\web\BadRequestHttpException"
Если запрос посылать так:

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

axios
				.put(this.appUrl + '/routesapi/update/'+point.id, point)
, то выскакивает 404 ошибка.

UPD Пока писала, что в URL забыла из инструкции вот такой параметр.

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

    'enableStrictParsing' => true,
И оказалось, что с ним не работают обычные контроллеры. 404 ошибка

В чем может быть дело - где я накосячила? Куда копать?
mcintosh-club.ru - первый мой сайт с использование Yii //
Акустика Sonus Faber Hi-End класса//
Необрезная доска и другие пиломатериалы
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: REST не работает

Сообщение andku83 »

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

    /**
     * @var bool whether to enable strict parsing. If strict parsing is enabled, the incoming
     * requested URL must match at least one of the [[rules]] in order to be treated as a valid request.
     * Otherwise, the path info part of the request will be treated as the requested route.
     * This property is used only when [[enablePrettyUrl]] is `true`.
     */
    public $enableStrictParsing = false;
для восстановления стандартного поведения при включенном enableStrictParsing добавьте в UrlManager:

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

    'rules' => [
        [
            'pattern' => '<controller:[\w-]+>/<action:[\w-]+>',
            'route' => '<controller>/<action>',
            'defaults' => ['controller' => 'site', 'action' => 'index']
        ],
    ]
defaults настройте под себя

насчет REST - не пользовался, не подскажу
Ответить