Вопрос по api

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Вопрос по api

Сообщение Dominus »

Получаем запись с id=1 методом GET

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

http://site.loc/api/v1/contacts/1
Получаем все записи страницы 2 методом GET

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

http://site.loc/api/v1/contacts?page=2
Редактируем запись с id=1 методом PUT

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

http://site.loc/api/v1/contacts/1
Данные в Json

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

'request' => [            
   //...
    'parsers' => [
        'application/json' => 'yii\web\JsonParser',
    ]
],
Если браузер firefox, то вот не плохое расширение для RESTful API: https://addons.mozilla.org/ru/firefox/addon/restclient/
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Artikk
Сообщения: 742
Зарегистрирован: 2017.02.10, 09:12

Re: Вопрос по api

Сообщение Artikk »

Dominus писал(а): 2018.10.02, 12:55 Получаем запись с id=1 методом GET

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

http://site.loc/api/v1/contacts/1
Получаем все записи страницы 2 методом GET

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

http://site.loc/api/v1/contacts?page=2
Редактируем запись с id=1 методом PUT

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

http://site.loc/api/v1/contacts/1
Данные в Json

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

'request' => [            
   //...
    'parsers' => [
        'application/json' => 'yii\web\JsonParser',
    ]
],
Если браузер firefox, то вот не плохое расширение для RESTful API: https://addons.mozilla.org/ru/firefox/addon/restclient/
https://clip2net.com/s/3X2s9L7 вот, тут json
мой контроллер:

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

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

use yii\rest\ActiveController;

class ContactsController extends ActiveController
{
    public $modelClass = 'api\modules\v1\models\Contacts';

    public function actionIndex(){

        $modelClass::findOne(1);

        return $modelClass;
    }
}
получаю xml:

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

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

Re: Вопрос по api

Сообщение Dominus »

Ну наверное браузер переводит в xml. Специальным расширением пользуйтесь для RESTful API

По поводу контроллера

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

namespace api\modules\v1\controllers;

use yii\rest\ActiveController;

class ContactsController extends ActiveController
{
    public $modelClass = 'api\modules\v1\models\Contacts';

    public function actionIndex(){

        $modelClass::findOne(1);

        return $modelClass;
    }
}
Достаточно этого:

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

namespace api\modules\v1\controllers;

use yii\rest\ActiveController;

class ContactsController extends ActiveController
{
    public $modelClass = 'api\modules\v1\models\Contacts';
    
    /**
     * @inheritdoc
     */
    public function behaviors()
    {
        $behaviors = parent::behaviors();

        // Add CORS filter
        $behaviors['corsFilter'] = [
            'class' => \yii\filters\Cors::class,
        ];
        
        return $behaviors;
    }
}
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Artikk
Сообщения: 742
Зарегистрирован: 2017.02.10, 09:12

Re: Вопрос по api

Сообщение Artikk »

Dominus писал(а): 2018.10.02, 13:37 Специальным расширением пользуйтесь для RESTful API
тО, которое вы советовали для мозиллы? потом будет делаться моб приложение, с этим не возникнет проблем, что xml?
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Вопрос по api

Сообщение Dominus »

Это расширение для тестирования RESTful API. То есть так как будет работать с вашим api любое другое приложение. В этом расширении вы и увидите реально, в каком формате приходят данные.
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Artikk
Сообщения: 742
Зарегистрирован: 2017.02.10, 09:12

Re: Вопрос по api

Сообщение Artikk »

Dominus писал(а): 2018.10.02, 14:10 Это расширение для тестирования RESTful API. То есть так как будет работать с вашим api любое другое приложение. В этом расширении вы и увидите реально, в каком формате приходят данные.
https://chrome.google.com/webstore/deta ... eloo?hl=ru это?
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Вопрос по api

Сообщение Dominus »

Artikk писал(а): 2018.10.02, 14:34
Dominus писал(а): 2018.10.02, 14:10 Это расширение для тестирования RESTful API. То есть так как будет работать с вашим api любое другое приложение. В этом расширении вы и увидите реально, в каком формате приходят данные.
https://chrome.google.com/webstore/deta ... eloo?hl=ru это?
Можно и это
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Artikk
Сообщения: 742
Зарегистрирован: 2017.02.10, 09:12

Re: Вопрос по api

Сообщение Artikk »

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

Re: Вопрос по api

Сообщение Dominus »

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

Re: Вопрос по api

Сообщение Artikk »

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

Re: Вопрос по api

Сообщение Dominus »

Например по Bearer токену
В контроллере подключаем фильтр

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

use yii\filters\auth\HttpBearerAuth;
Там же добавляем поведение

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

    public function behaviors()
    {
        $behaviors = parent::behaviors();
        // Add CORS filter
        $behaviors['corsFilter'] = [
            'class' => Cors::class,
        ];
        // header('Authorization: Bearer FFFF70it7tzNsHddEiq0BZ0i-OU8S3xV');
        $behaviors['authenticator']['class'] = HttpBearerAuth::class;
        // avoid authentication on CORS-pre-flight requests (HTTP OPTIONS method)
        $behaviors['authenticator']['except'] = ['options'];
        return $behaviors;
    }
https://github.com/Dominus77/task/blob/ ... roller.php
В общем то и всё.

Ключ авторизации находится в модели User, атрибут auth_key
https://github.com/Dominus77/task/blob/ ... #L113-L116
Так же должен быть реализован метод проверки
https://github.com/Dominus77/task/blob/ ... hp#L86-L89

Проверяем, вставляем наш токен в header

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

Authorization: Bearer FFFF70it7tzNsHddEiq0BZ0i-OU8S3xV
и делаем запрос.
Изображение
Если токен убрать из header или изменить, получим 401 Unauthorized
Изображение
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Вопрос по api

Сообщение andku83 »

Artikk писал(а): 2018.10.02, 12:53 и как json строку сделать, а не xml?
причина в браузере - он в заголовке отправляет:

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

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
А ActiveController по-умолчанию поддерживает 2 типа ответа: json и xml

Можно отключить поддержку xml:

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

    public function behaviors()
    {
        $behaviors = parent::behaviors();

        $behaviors['contentNegotiator'] = [
            'class' => ContentNegotiator::class,
            'formats' => [
                'application/json' => Response::FORMAT_JSON,
//                'application/xml' => Response::FORMAT_XML,
            ],
        ];
        return $behaviors;
    }
Я для тестирования использую Postman

Можно использовать встроенный в PhpStorm: Tools -> HTTP Client -> Test RESTfull Web Service
Artikk
Сообщения: 742
Зарегистрирован: 2017.02.10, 09:12

Re: Вопрос по api

Сообщение Artikk »

Вопрос по поводу post.
Вот контроллер:

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

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

use api\modules\v1\models\UsersR;
use yii\rest\ActiveController;

class SignupController extends ActiveController
{
    public $modelClass = 'api\modules\v1\models\UsersR';


   public function actionCreate(){

        $model = new UsersR();
        $model->load(\Yii::$app->getRequest()->getBodyParams(), '');
        $model->save();

        return $model;
    }


}
пишет это:
https://c2n.me/3X3VRPQ
Вставил данные: https://c2n.me/3X3VVod
но пишет все равно ошибку....
Последний раз редактировалось Artikk 2018.10.03, 13:26, всего редактировалось 1 раз.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Вопрос по api

Сообщение ElisDN »

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

$model = new UsersR();
$model->load(Yii::$app->request->bodyParams, '');
$model->save();
Последний раз редактировалось ElisDN 2018.10.03, 15:54, всего редактировалось 1 раз.
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Вопрос по api

Сообщение andku83 »

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

$model->load(Yii::$app->request->bodyParams, '');
По идее так будет правильнее.
Artikk
Сообщения: 742
Зарегистрирован: 2017.02.10, 09:12

Re: Вопрос по api

Сообщение Artikk »

разобрался, спасибо
Artikk
Сообщения: 742
Зарегистрирован: 2017.02.10, 09:12

Re: Вопрос по api

Сообщение Artikk »

https://c2n.me/3X562EE подскажитЕ, как скрыть данные? чтобы не было видно телефона, почты
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Вопрос по api

Сообщение ElisDN »

Методом fields().
Artikk
Сообщения: 742
Зарегистрирован: 2017.02.10, 09:12

Re: Вопрос по api

Сообщение Artikk »

ElisDN писал(а): 2018.10.04, 08:19 Методом fields().
Мне нужно сделать: Уведомление об успешной или неуспешной регистрации. В виде json с данными пользователя, если она успешная. и при регистрации хешировать пароль.
Вот мой код:

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

public function actionCreate(){
        $model = new UsersR();
        $params = Yii::$app->request->post();
        $model->username = $params['username'];
        $model->password = \Yii::$app->security->generatePasswordHash($params['password']);
        $model->name = $params['name'];
        $model->phone = $params['phone'];
        $model->city = $params['city'];

        if ($model->save()) {
            $response['isSuccess'] = 201;
            $response['message'] = 'You are now a member!';
            $response['user'] = UsersR::findOne($model->username);

            return  $this->redirect([$this->viewAction, 'id' =>  $response['user']->id]);
        }
        else {
            //$model->validate();
            $model->getErrors();
            $response['hasErrors'] = $model->hasErrors();
            $response['errors'] = $model->getErrors();
            //return = $model;
            return $response;

        }
    }
пароль не хешируется. и как сделать ответ, что регистрация успешно? и можете объяснит mrfr правильно тестить данные методы, т.е. я хотел посмотреть что показывает var_dump, но там ничего нет.
Методом fields().
можете показать на примере, как например скрыть пароль? т.к. я не знаю как это сделать...
Ответить