Не получается пример "Быстрый старт RESTfulAPI"

Всё что касается построения API
Ответить
lanket
Сообщения: 10
Зарегистрирован: 2013.11.27, 23:25

Не получается пример "Быстрый старт RESTfulAPI"

Сообщение lanket »

Всем доброго времени суток. помогите пожалуйста.
Требуется простейшая задача: получать события с JSON данными по REST от VK / Запоминать их в базе. Дальнейшая обработка отдельный вопрос.

Установил фрэймворк, добавил приложение BASIC.
Приложение работает по адресу [url]https://url_site/basic/web[/url]

Добавил таблицу и сгенерил для нее модель через gii
\basic\models\Participants.php

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

<?php

namespace app\models;

use Yii;

/**
 * This is the model class for table "participants".
 *
 * @property int $id
 * @property int $id_participants Идентификатор в ВК
 * @property string $first_name Имя
 * @property string $last_name Фамилия
 * @property string $bdate День рождения
 */
class Participants extends \yii\db\ActiveRecord
{
    /**
     * {@inheritdoc}
     */
    public static function tableName()
    {
        return 'participants';
    }

    /**
     * {@inheritdoc}
     */
    public function rules()
    {
        return [
            [['id_participants', 'first_name', 'last_name', 'bdate'. 'reg_date'], 'required'],
            [['id_participants'], 'integer'],
            [['first_name', 'last_name'], 'string'],
            [['bdate'], 'safe'],
            [['reg_date'], 'safe'],
        ];
    }

    /**
     * {@inheritdoc}
     */
    public function attributeLabels()
    {
        return [
            'id' => 'ID',
            'id_participants' => 'Идентификатор в ВК',
            'first_name' => 'Имя',
            'last_name' => 'Фамилия',
            'bdate' => 'День рождения',
            'reg_date' => 'Дата и время когда добавился в группу',
        ];
    }
}
Далее пошел по описанию Быстрый старт создания RESTfulAPI

Создал контроллер
\basic\controllers\CallBackController.php

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

<?php

/* 
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

namespace app\controllers;

use yii\rest\ActiveController;

class CallBackController extends ActiveController
{
    public $modelClass = 'app\models\Participants';
    //public $modelClass = 'basic\models\Participants';
}
Создал \basic\web\callback.php

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

<?php

// NOTE: Make sure this file is not accessible when deployed to production
if (!in_array(@$_SERVER['REMOTE_ADDR'], ['127.0.0.1', '::1'])) {
    die('You are not allowed to access this file.');
}

defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'test');

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

$config = require __DIR__ . '/../config/rest.php';

(new yii\web\Application($config))->run();
ну и для него создал файл конфигурации скопировав web.php и добавив в него по инструкции
\basic\config\rest.php

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

<?php

$params = require __DIR__ . '/params.php';
$db = require __DIR__ . '/db.php';

$config = [
    'id' => 'rest',
    'basePath' => dirname(__DIR__),
    'bootstrap' => ['log'],
    'aliases' => [
        '@bower' => '@vendor/bower-asset',
        '@npm'   => '@vendor/npm-asset',
    ],
    'components' => [
        'request' => [
            // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation
            'cookieValidationKey' => 'rest',
            'parsers' => [
                'application/json' => 'yii\web\JsonParser',
            ],

        ],
        'cache' => [
            'class' => 'yii\caching\FileCache',
        ],
        'user' => [
            'identityClass' => 'app\models\User',
            'enableAutoLogin' => true,
        ],
        'errorHandler' => [
            'errorAction' => 'site/error',
        ],
        'mailer' => [
            'class' => 'yii\swiftmailer\Mailer',
            // send all mails to a file by default. You have to set
            // 'useFileTransport' to false and configure a transport
            // for the mailer to send real emails.
            'useFileTransport' => true,
        ],
        'log' => [
            'traceLevel' => YII_DEBUG ? 3 : 0,
            'targets' => [
                [
                    'class' => 'yii\log\FileTarget',
                    'levels' => ['error', 'warning'],
                ],
            ],
        ],
        'db' => $db,
        'urlManager' => [
            'enablePrettyUrl' => true,
            'enableStrictParsing' => true,
            'showScriptName' => false,
            'rules' => [
                ['class' => 'yii\rest\UrlRule', 'controller' => 'callback'],
            ],
        ], 
    ],
    'params' => $params,
];

if (YII_ENV_DEV) {
    // configuration adjustments for 'dev' environment
    $config['bootstrap'][] = 'debug';
    $config['modules']['debug'] = [
        'class' => 'yii\debug\Module',
        // uncomment the following to add your IP if you are not connecting from localhost.
        'allowedIPs' => ['127.0.0.1', '::1' , 'my_ip', 'ip_ssl_route'],
    ];

    $config['bootstrap'][] = 'gii';
    $config['modules']['gii'] = [
        'class' => 'yii\gii\Module',
        // uncomment the following to add your IP if you are not connecting from localhost.
        'allowedIPs' => ['127.0.0.1', '::1',  'my_ip', 'ip_ssl_route'],
    ];
}

return $config;

в результате не могу добиться что бы хоть чтото от REST получить

view-source:https://url_site/basic/callback/callback/1

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

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL /basic/callback/callback/1 was not found on this server.</p>
<hr>
<address>Apache/2.4.18 (Ubuntu) Server at url_site Port 80</address>
</body></html>
view-source:https://url_site/basic/callback/1
view-source:https://url_site/basic/web/callback/1
view-source:https://url_site/callback/1

ответы такиеже

Что я не так делаю?
Аватара пользователя
darlov
Сообщения: 204
Зарегистрирован: 2012.01.31, 16:09

Re: Не получается пример "Быстрый старт RESTfulAPI"

Сообщение darlov »

Похоже у Вас даже Yii не запускается, думаю нужно настроить файл .htaccess
lanket
Сообщения: 10
Зарегистрирован: 2013.11.27, 23:25

Re: Не получается пример "Быстрый старт RESTfulAPI"

Сообщение lanket »

darlov писал(а): 2019.02.13, 14:41 Похоже у Вас даже Yii не запускается, думаю нужно настроить файл .htaccess
Спасибо что отозвались.

Как проверить?
Что попробовать?

Так https://url_site/basic/web/index.php работает без проблем.
Хотя это без urlmanager.

Попробовал добавить настройку urlmanaer для web
Посмотрел и поправил настройки виртуал хоста теперь должно работать https://site_url/ сразу из папки /basic/web и с urlmanagerom
В результате и это сломалось

В настройку хоста добавил

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

# Устанавливаем корневой директорией "basic/web"
DocumentRoot "/var/www/vhost/basic/web"

<Directory "/var/www/vhost/basic/web">
    RewriteEngine on

    # Если запрашиваемая в URL директория или файл существуют обращаемся к ним напрямую
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    # Если нет - перенаправляем запрос на index.php
    RewriteRule . index.php

    # ...прочие настройки...
</Directory>
Апача конечно перегружал.

и как рекомендованно в php.ini сктановил cgi.fix_pathinfo=0

а вот fastcgi_param HTTPS on не понял где менять, в php.ini (v5,6) такой директивы нет закоментированной.
Куда это вставлять?


Так что делать то?
lanket
Сообщения: 10
Зарегистрирован: 2013.11.27, 23:25

Re: Не получается пример "Быстрый старт RESTfulAPI"

Сообщение lanket »

В логах ошибок апача при обращении появляются такие ошибки

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

[Wed Feb 13 23:39:14.450911 2019] [rewrite:error] [pid 28986] [client ip:port] AH00670: Options FollowSymLinks and SymLinksIfOwnerMatch are both off, so the RewriteRule directive is also forbidden due to its similar ability to circumvent directory restrictions : /var/www/site_url/basic/web/
Я так понял Rewrite не нравиться что сайт лежит в симлинке.

Как его подружить?
lanket
Сообщения: 10
Зарегистрирован: 2013.11.27, 23:25

Re: Не получается пример "Быстрый старт RESTfulAPI"

Сообщение lanket »

Нагуглил что надо добавить в директивы апача, а конкретно директории:

Options FollowSymLinks

В результате директивы хоста выглядят так:

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

DocumentRoot "/var/www/url_site/basic/web"
ServerName vk.lanket.ru
<Directory "/var/www/url_site/basic/web">
Options FollowSymLinks
RewriteEngine on
# Если запрашиваемая в URL директория или файл существуют обращаемся к ним напрямую
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Если нет - перенаправляем запрос на index.php
RewriteRule . index.php
allow from all
Options None
Require all granted
</Directory>

Уточню на всякий случай папка /var/www/url_site является симлинком

Сложилось исторически что так надо.
lanket
Сообщения: 10
Зарегистрирован: 2013.11.27, 23:25

Re: Не получается пример "Быстрый старт RESTfulAPI"

Сообщение lanket »

Забыл указать что теперь не 404 а 403 ошибка

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

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access /
on this server.<br />
</p>
<hr>
<address>Apache/2.4.18 (Ubuntu) Server at vk.lanket.ru Port 80</address>
</body></html>
lanket
Сообщения: 10
Зарегистрирован: 2013.11.27, 23:25

Re: Не получается пример "Быстрый старт RESTfulAPI"

Сообщение lanket »

Что делать то? Как заставить работать?
Аватара пользователя
darlov
Сообщения: 204
Зарегистрирован: 2012.01.31, 16:09

Re: Не получается пример "Быстрый старт RESTfulAPI"

Сообщение darlov »

Что при беглом осмотре бросается в глаза, это
Вы создали точку входа
\basic\web\callback.php
А апачу указываете
RewriteRule . index.php
lanket
Сообщения: 10
Зарегистрирован: 2013.11.27, 23:25

Re: Не получается пример "Быстрый старт RESTfulAPI"

Сообщение lanket »

Спасибо всем отозвавшимся.

Нашел время продолжить осваивать API

ReWrite получилось победить заменив в виртуалхосте
Options None
на
Options All


обратившись по адресу https://url_site/callback/
получил список всех записей из модели
и фронтенд по адресу https://url_site/ теперь тоже нормально работает

Еще на нерусском форуме подсказали что неправильно указал имя контроллер CallBack и поэтому тоже не работало надо Callback и в названии файла и в объявлении класса контроллера. А CallBack интерпретируется в call-back

Но https://url_site/callback/1/ = 404

Запросы POST HEAD тоже не работают

POST:

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

HTTP/1.1 405 
pragma: no-cache
date: Wed, 20 Mar 2019 22:09:10 GMT
allow: GET, HEAD
x-debug-duration: 19
server: cloudflare
expect-ct: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
vary: Accept
x-debug-link: /debug/default/view?tag=5c92ba
content-type: application/json; charset=UTF-8
status: 405
cache-control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
x-debug-tag: 5c92ba
cf-ray: 4bab024b1be56361-FRA
content-length: 199
expires: Thu, 19 Nov 1981 08:52:00 GMT

{"name":"Method Not Allowed","message":"Method Not Allowed. This URL can only handle the following request methods: GET, HEAD.","code":0,"status":405,"type":"yii\\web\\MethodNotAllowedHttpException"}
HEAD :

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

HTTP/1.1 200 
x-pagination-page-count: 1
date: Wed, 20 Mar 2019 21:48:28 GMT
content-encoding: br
cf-ray: 4baae3f60e7c6361-FRA
x-debug-link: /debug/default/view?tag=5c92b5
status: 200
x-debug-tag: 5c92b5
x-pagination-total-count: 1
x-pagination-per-page: 20
pragma: no-cache
x-debug-duration: 93
server: cloudflare
expect-ct: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
vary: Accept
content-type: application/json; charset=UTF-8
cache-control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
x-pagination-current-page: 1
link: <http://site_url/callbacks?page=1>; rel=self
expires: Thu, 19 Nov 1981 08:52:00 GMT

Хотя в описании написанно мол уже должно работать.

Что не так?
Куда копать?
Аватара пользователя
danilatlt
Сообщения: 26
Зарегистрирован: 2012.06.05, 13:07

Re: Не получается пример "Быстрый старт RESTfulAPI"

Сообщение danilatlt »

напиши мне ПМ в https://vk.com/danil.sidorov
cкайп danil.sidorov
Ответить