Вопрос по api

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Artikk
Сообщения: 742
Зарегистрирован: 2017.02.10, 09:12

Вопрос по api

Сообщение Artikk »

Здравствуйте. Есть вопрос по поводу api. У меня есть сайт, нужно сделать моб. приложение под него, но api нет. Можете в двух словах объяснить, как его делать? я так понял это данные из бд каждой таблицы в json запихать, создать для каждого контроллера свой api-контроллер и там json вывести или я ошибаюсь?
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Вопрос по api

Сообщение Dominus »

Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Artikk
Сообщения: 742
Зарегистрирован: 2017.02.10, 09:12

Re: Вопрос по api

Сообщение Artikk »

вопрос, вот в примере:

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

 UserController extends ActiveController
а если у меня уже есть UserController который наследуется от AppController. это мне нужно второй User2Controller создавать или просто AppController наследовать не от Controller, а от ActiveController?
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Вопрос по api

Сообщение Dominus »

Для api, контроллер наследуется от yii\rest\ActiveController;
Вот тут на днях делал api для basic. API вынесено как отдельное приложение https://github.com/Dominus77/task/tree/master/api
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Artikk
Сообщения: 742
Зарегистрирован: 2017.02.10, 09:12

Re: Вопрос по api

Сообщение Artikk »

Dominus писал(а): 2018.09.29, 18:36 Для api, контроллер наследуется от yii\rest\ActiveController;
Вот тут на днях делал api для basic. API вынесено как отдельное приложение https://github.com/Dominus77/task/tree/master/api
спасибо, буду разбираться
Artikk
Сообщения: 742
Зарегистрирован: 2017.02.10, 09:12

Re: Вопрос по api

Сообщение Artikk »

Dominus писал(а): 2018.09.29, 18:36 Для api, контроллер наследуется от yii\rest\ActiveController;
Вот тут на днях делал api для basic. API вынесено как отдельное приложение https://github.com/Dominus77/task/tree/master/api
начал реализовывать и столкнулся с проблемой:
https://c2n.me/3X2beHK это основной конфиг.
Вот мой контроллер в папке api:

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

<?php
namespace app\api\modules\v1\controllers;

use yii\rest\ActiveController;

class ContactsController extends ActiveController
{
    // We are using the regular web app modules:
    public $modelClass = 'app\api\modules\v1\models\Contacts';

    public function actionIndex(){

        return 'hello';
    }
}
по адресу: http://site.loc/api/contacts/index получаю 404 ошибку, страница не найдена. можете объяснить почему?
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Вопрос по api

Сообщение Dominus »

Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Artikk
Сообщения: 742
Зарегистрирован: 2017.02.10, 09:12

Re: Вопрос по api

Сообщение Artikk »

Dominus писал(а): 2018.10.02, 11:23 .htaccess настроен?
https://github.com/Dominus77/task/blob/ ... ss#L16-L21
когда вставил:

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

Options +FollowSymLinks
IndexIgnore */*
RewriteEngine on

 # the main rewrite rule for the frontend application
    RewriteCond %{REQUEST_URI} !^/(api/web|api)
    RewriteRule !^web /web%{REQUEST_URI} [L]

    # redirect to the page without a trailing slash (uncomment if necessary)
    RewriteCond %{REQUEST_URI} ^/api
    RewriteRule ^api(.*) /api/web/$1 [L]
    
RewriteCond %{REQUEST_URI} !^/(web)
RewriteRule ^assets/(.*)$ /web/assets/$1 [L]
RewriteRule ^css/(.*)$ web/css/$1 [L]
RewriteRule ^fonts/(.*)$ web/fonts/$1 [L]
RewriteRule ^js/(.*)$ web/js/$1 [L]
RewriteRule ^img/(.*)$ web/img/$1 [L]
RewriteRule (.*) /web/$1

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /web/index.php
получил другую ошибку: https://c2n.me/3X2f72l
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Вопрос по api

Сообщение Dominus »

Это уже ответ от api, значит перенаправление работает.
Правила роутинга в api/config/api.php указаны?

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

'urlManager' => [
    'enablePrettyUrl' => true,
    'enableStrictParsing' => true,
    'showScriptName' => false,
    'rules' => [
        [
            'class' => 'yii\rest\UrlRule',
            'controller' => [
                'v1/contacts'
            ],
            'pluralize' => false,
        ],
    ],
],
и ссылка будет:

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

 http://site.loc/api/v1/contacts
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Artikk
Сообщения: 742
Зарегистрирован: 2017.02.10, 09:12

Re: Вопрос по api

Сообщение Artikk »

Dominus писал(а): 2018.10.02, 11:59 Это уже ответ от api, значит перенаправление работает.
Правила роутинга в api/config/api.php указаны?

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

'urlManager' => [
    'enablePrettyUrl' => true,
    'enableStrictParsing' => true,
    'showScriptName' => false,
    'rules' => [
        [
            'class' => 'yii\rest\UrlRule',
            'controller' => [
                'v1/contacts'
            ],
            'pluralize' => false,
        ],
    ],
],
и ссылка будет:

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

 http://site.loc/api/v1/contacts
Вот файл api.php:

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

<?php

$db     = require(__DIR__ . '/../../config/db.php');
$params = require(__DIR__ . '/params.php');

$config = [
    'id' => 'basic',
    'name' => 'TimeTracker',
    // Need to get one level up:
    'basePath' => dirname(__DIR__).'/..',
    'bootstrap' => ['log'],
    'components' => [
        'request' => [
            // Enable JSON Input:
            'parsers' => [
                'application/json' => 'yii\web\JsonParser',
            ]
        ],
        'log' => [
            'traceLevel' => YII_DEBUG ? 3 : 0,
            'targets' => [
                [
                    'class' => 'yii\log\FileTarget',
                    'levels' => ['error', 'warning'],
                    // Create API log in the standard log dir
                    // But in file 'api.log':
                    'logFile' => '@app/runtime/logs/api.log',
                ],
            ],
        ],
        'urlManager' => [
            'enablePrettyUrl' => true,
            'enableStrictParsing' => true,
            'showScriptName' => false,
            'rules' => [
                [
                    'class' => 'yii\rest\UrlRule',
                    'controller' => [
                        'v1/contacts'
                    ],
                    'pluralize' => false,
                ],
            ],
        ],
        'db' => $db,
        'user' => [
            'identityClass' => 'app\models\User',
            'enableAutoLogin' => false,
        ],
    ],
    'modules' => [
        'v1' => [
            'class' => 'app\api\modules\v1\Module',
        ],
    ],
    'params' => $params,
];

return $config;
но ошибка https://c2n.me/3X2h5gl та же
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Вопрос по api

Сообщение Dominus »

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

'homeUrl' => '/api',
'components' => [
    'request' => [
            'cookieValidationKey' => '10-LLBFJCzkPFn6osY6xPSsDZDfJ89joG',
            'baseUrl' => '/api',
            'parsers' => [
                'application/json' => 'yii\web\JsonParser',
        ],
    ],
    //...
],
'modules' => [
    'v1' => [
        'class' => 'api\modules\v1\Module'   // here is our v1 modules
    ],
],
Последний раз редактировалось Dominus 2018.10.02, 12:13, всего редактировалось 1 раз.
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Artikk
Сообщения: 742
Зарегистрирован: 2017.02.10, 09:12

Re: Вопрос по api

Сообщение Artikk »

Dominus писал(а): 2018.10.02, 12:09

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

'homeUrl' => '/api',
'modules' => [
    'v1' => [
        'class' => 'api\modules\v1\Module'   // here is our v1 modules
    ],
],
поправил, но ошибка та же:

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

<?php

$db     = require(__DIR__ . '/../../config/db.php');
$params = require(__DIR__ . '/params.php');

$config = [
    'id' => 'basic',
    'name' => 'Auto',
    // Need to get one level up:
    'basePath' => dirname(__DIR__).'/..',
    'bootstrap' => ['log'],
    'homeUrl' => '/api',
    'components' => [
        'request' => [
            // Enable JSON Input:
            'parsers' => [
                'application/json' => 'yii\web\JsonParser',
            ]
        ],
        'log' => [
            'traceLevel' => YII_DEBUG ? 3 : 0,
            'targets' => [
                [
                    'class' => 'yii\log\FileTarget',
                    'levels' => ['error', 'warning'],
                    // Create API log in the standard log dir
                    // But in file 'api.log':
                    'logFile' => '@app/runtime/logs/api.log',
                ],
            ],
        ],
        'urlManager' => [
            'enablePrettyUrl' => true,
            'enableStrictParsing' => true,
            'showScriptName' => false,
            'rules' => [
                [
                    'class' => 'yii\rest\UrlRule',
                    'controller' => [
                        'v1/contacts'
                    ],
                    'pluralize' => false,
                ],
            ],
        ],
        'db' => $db,
        'user' => [
            'identityClass' => 'app\models\User',
            'enableAutoLogin' => false,
        ],
    ],
    'modules' => [
        'v1' => [
            'class' => 'api\modules\v1\Module'
        ],
    ],
    'params' => $params,
];

return $config;
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Вопрос по api

Сообщение Dominus »

Добавил постом выше еще.
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Artikk
Сообщения: 742
Зарегистрирован: 2017.02.10, 09:12

Re: Вопрос по api

Сообщение Artikk »

Dominus писал(а): 2018.10.02, 12:13 Добавил постом выше еще.
Module.php:

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

<?php

namespace api\modules\v1;
use yii\filters\RateLimiter;
/**
 * Class Module
 * @package api\modules\v1
 */
class Module extends \yii\base\Module
{
    /**
     * @inheritdoc
     */
    public $controllerNamespace = 'api\modules\v1\controllers';
    /**
     * @inheritdoc
     */

    public function behaviors()
    {
        return [
            'rateLimiter' => [
                'class' => RateLimiter::class,
                'enableRateLimitHeaders' => true,
            ],
        ];
    }
    /**
     * @inheritdoc
     */
    public function init()
    {
        parent::init();
    }
}
ошибку пишет Class api\modules\v1\Module does not exist
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Вопрос по api

Сообщение Dominus »

В общем вот конфиг: api.php

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

<?php

$params = require dirname(dirname(__DIR__)) . '/config/params.php';
$db = require dirname(dirname(__DIR__)) . '/config/db.php';

$config = [
    'id' => 'app-api',
    'language' => 'en',
    'basePath' => dirname(dirname(__DIR__)),
    'bootstrap' => [
        'log',        
    ],
    'homeUrl' => '/api',
    'aliases' => [
        '@api' => '@app/api',        
    ],
    'modules' => [
        'v1' => [
            'class' => 'api\modules\v1\Module'   // here is our v1 modules
        ],
    ],
    'components' => [
        'request' => [
            'cookieValidationKey' => '10-LLBFJCzkPFn6osY6xPSsDZDfJ89joG',
            'baseUrl' => '/api',
            'parsers' => [
                'application/json' => 'yii\web\JsonParser',
            ]
        ],
        'user' => [
            'identityClass' => 'api\modules\v1\models\User',
            'enableSession' => false,
            'enableAutoLogin' => false,
            'loginUrl' => null,
        ],
        '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' => [
                        'v1/contacts'
                    ],
                    'pluralize' => false,
                ],
            ],
        ],
        'cache' => [
            'class' => 'yii\caching\FileCache',
        ],
    ],
    'params' => $params,
];
return $config;
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Вопрос по api

Сообщение Dominus »

Artikk писал(а): 2018.10.02, 12:16 ошибку пишет Class api\modules\v1\Module does not exist
Потому что не определен alias в api.php

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

'aliases' => [
        '@api' => '@app/api',        
    ],
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Artikk
Сообщения: 742
Зарегистрирован: 2017.02.10, 09:12

Re: Вопрос по api

Сообщение Artikk »

Dominus писал(а): 2018.10.02, 11:59 Это уже ответ от api, значит перенаправление работает.
Правила роутинга в api/config/api.php указаны?

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

'urlManager' => [
    'enablePrettyUrl' => true,
    'enableStrictParsing' => true,
    'showScriptName' => false,
    'rules' => [
        [
            'class' => 'yii\rest\UrlRule',
            'controller' => [
                'v1/contacts'
            ],
            'pluralize' => false,
        ],
    ],
],
и ссылка будет:

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

 http://site.loc/api/v1/contacts
Получилось, но почемуто hello не вывелось, буду разбираться:

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

<response>
<item>
<id>1</id>
<title>Контакты</title>
<keywords>Контакты</keywords>
<description>Контакты</description>
<text>
<span style="font-size:16px;">Доступны с 09.00 до 21.00. Ежедневно!<br />
 <br />
 Наш контактный номер +7(915)00<br />
 <br />
 С нами можно связаться по WhatsApp, Viber, Telegram<br />
 <br />
 Telegram: @mera<br />
 <br />
 Email:&nbsp;mail.ru</span><br />
 <br />
 &nbsp;
</text>
</item>
</response>
у меня 3 вопроса:
1. это нужно както скрывать, т.е. для залогиненых юзеров или нет?
2. вот у меня на сайте допустим контроллеры: Contacts, About и т.д. это мне для каждого контроллера (а именно action) нужно api делать, так?
3/ откуда взялись эти данные? из layout?
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Вопрос по api

Сообщение Dominus »

Можно сделать Главный api контроллер, и от него наследовать остальные.
К примеру такой:
https://github.com/Dominus77/task/blob/ ... roller.php
Тут авторизация по Bearer токену, настройка доступа к действиям по RBAC, отключение действий delete и create. А так все действия идут из коробки, которые можно переопределять.
https://www.yiiframework.com/doc/api/2. ... controller
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Вопрос по api

Сообщение Dominus »

Посмотрите простую реализацию вывода сообщения.
Контроллер:
https://github.com/Dominus77/task/blob/ ... roller.php
Модель:
https://github.com/Dominus77/task/blob/ ... essage.php

Соответственно не забыть добавить правила роутинга

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

    [
            'class' => 'yii\rest\UrlRule',
            'controller' => [
                'v1/contacts'
            ],
            'pluralize' => false,
    ],
    [
            'class' => 'yii\rest\UrlRule',
            'controller' => [
                'v1/message'
            ],
            'pluralize' => false,
    ],
и ссылка будет:

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

http://site.loc/api/v1/message
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Artikk
Сообщения: 742
Зарегистрирован: 2017.02.10, 09:12

Re: Вопрос по api

Сообщение Artikk »

Dominus писал(а): 2018.10.02, 12:38 Посмотрите простую реализацию вывода сообщения.
Контроллер:
https://github.com/Dominus77/task/blob/ ... roller.php
Модель:
https://github.com/Dominus77/task/blob/ ... essage.php

Соответственно не забыть добавить правила роутинга

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

    [
            'class' => 'yii\rest\UrlRule',
            'controller' => [
                'v1/contacts'
            ],
            'pluralize' => false,
    ],
    [
            'class' => 'yii\rest\UrlRule',
            'controller' => [
                'v1/message'
            ],
            'pluralize' => false,
    ],
и ссылка будет:

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

http://site.loc/api/v1/message
как мне вывести одну запись, наример $contacts = Contacts::findOne(1);
это мне нужно в xml конвертнуть?
и как json строку сделать, а не xml?
Ответить