В этой серии «Программирование с Yii2» я расскажу читателям, как использовать Yii2 Framework для PHP. Возможно, вас также заинтересует мое Введение в Yii Framework , в котором рассматриваются преимущества Yii и содержится обзор того, что нового в Yii 2.x.
В сегодняшнем руководстве я расскажу, как создать REST API в Yii для подключения вашего приложения к облаку, мобильным приложениям и другим службам. Я проведу вас через краткое руководство по REST API Yii и предоставлю контекст и примеры распространенных запросов.
Начало работы с API YEST REST
Создание REST API в Yii на самом деле довольно просто. Вы можете использовать существующую инфраструктуру MVC, но вы создаете отдельную точку доступа, к которой вы собираетесь обращаться различными видами услуг (не посетителями сайта).
Преимущества платформы Yii REST
Yii Framework предоставляет широкую поддержку и подробную документацию для создания API. Вот некоторые из встроенных возможностей при создании API:
- Быстрое создание прототипов с поддержкой общих API для Active Record . Это позволяет быстро и легко раскрыть функциональность CRUD модели данных через API.
- Согласование формата ответа (с поддержкой JSON и XML по умолчанию). Есть встроенная поддержка для возврата данных в общих форматах вывода.
- Настраиваемая сериализация объектов с поддержкой выбираемых полей вывода. Легко изменить, какие данные возвращаются.
- Правильное форматирование сбора данных и ошибки проверки.
- Поддержка гипермедиа как движок состояния приложения (HATEOAS)
- Эффективная маршрутизация с правильной проверкой глагола HTTP.
- Встроенная поддержка глаголов
OPTIONS
иHEAD
. - Аутентификация и авторизация.
- Кеширование данных и HTTP-кеширование.
- Ограничение скорости.
У меня не будет возможности затронуть все это сегодня.
Мой интерес к REST API
В этом эпизоде я создам API, который позволит нам манипулировать таблицей «Предмет», которую я создал в сервисе Twixxr из этого учебника по API Twitter . Но я также планирую создать API для нашей серии учебных пособий для начинающих , Meeting Planner . Безопасный API будет необходим для создания приложения iOS для сервиса. API позволит установить связь между мобильным приложением и облачным сервисом.
Сборка REST-контроллера
С помощью инфраструктуры REST Yii мы создадим конечную точку для нашего API и организуем контроллеры для каждого типа ресурса.
Ресурсы — это, по сути, модели данных нашего приложения. Это расширение yii \ base \ Model .
Класс yii \ rest \ UrlRule обеспечивает готовую маршрутизацию, отображающую нашу модель данных на конечные точки API CRUD:
Создание дерева, действующего как конечная точка API
В расширенном шаблоне Yii2 есть интерфейсное и внутреннее дерево, и это расширяемое. Чтобы выделить функции API, мы создадим третье дерево, которое будет действовать исключительно как конечная точка API.
Разработчик Yii Алекс Макаров предоставляет это полезное руководство по созданию дополнительных деревьев, которое я использовал для создания своего третьего дерева:
1
2
3
|
$ cp -R backend api
$ cp -R environments/dev/backend/ environments/dev/api
$ cp -R environments/prod/backend/ environments/prod/api
|
Затем я использовал редактор Atom, чтобы выполнить глобальный поиск и заменить «backend» на «api» в новом дереве api.
И я добавил псевдоним API в /common/config/bootstrap.php:
1
2
3
4
5
6
7
|
<?php
Yii::setAlias(‘@common’, dirname(__DIR__));
Yii::setAlias(‘@frontend’, dirname(dirname(__DIR__)) . ‘/frontend’);
Yii::setAlias(‘@backend’, dirname(dirname(__DIR__)) . ‘/backend’);
Yii::setAlias(‘@api’, dirname(dirname(__DIR__)) . ‘/api’);
Yii::setAlias(‘@console’, dirname(dirname(__DIR__)) . ‘/console’);
Yii::setAlias(‘@twixxr’, dirname(dirname(__DIR__)) . ‘/twixxr’);
|
Настройка маршрутизации URL для входящих запросов
В /api/config/main.php нам нужно добавить request[]
для анализа разбора установки JSON и UrlRule
для UrlRule
методов для моделей и их конечных точек:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
|
return [
‘id’ => ‘app-api’,
‘basePath’ => dirname(__DIR__),
‘controllerNamespace’ => ‘api\controllers’,
‘bootstrap’ => [‘log’],
‘modules’ => [],
‘components’ => [
‘request’ => [
‘parsers’ => [
‘application/json’ => ‘yii\web\JsonParser’,
],
],
‘urlManager’ => [
‘enablePrettyUrl’ => true,
‘enableStrictParsing’ => true,
‘showScriptName’ => false,
‘rules’ => [
[‘class’ => ‘yii\rest\UrlRule’, ‘controller’ => ‘item’],
[‘class’ => ‘yii\rest\UrlRule’, ‘controller’ => ‘user’],
],
],
|
Это в основном все, что нужно, чтобы включить некоторые функциональные возможности API для этих моделей.
Примеры с cURL
Давайте начнем делать запросы.
Запрашиваемые опции
Покажите мне доступные методы API:
1
2
|
curl -i -H «Accept: application/json»
-X OPTIONS «http://localhost:8888/api/items»
|
Вот ответ ( GET, POST, HEAD, OPTIONS
):
1
2
3
4
5
6
7
|
HTTP/1.1 200 OK
Date: Tue, 25 Oct 2016 20:23:10 GMT
Server: Apache/2.2.31 (Unix) mod_wsgi/3.5 Python/2.7.12 PHP/7.0.10 mod_ssl/2.2.31 OpenSSL/1.0.2h DAV/2 mod_fastcgi/2.4.6 mod_perl/2.0.9 Perl/v5.24.0
X-Powered-By: PHP/7.0.10
Allow: GET, POST, HEAD, OPTIONS
Content-Length: 0
Content-Type: application/json;
|
ПОЛУЧИТЬ запросы
Запрос: сколько данных есть?
1
|
curl -i —head «http://localhost:8888/api/items»
|
Ответ: 576 записей на 29 страницах …
01
02
03
04
05
06
07
08
09
10
|
HTTP/1.1 200 OK
Date: Tue, 25 Oct 2016 23:17:37 GMT
Server: Apache/2.2.31 (Unix) mod_wsgi/3.5 Python/2.7.12 PHP/7.0.10 mod_ssl/2.2.31 OpenSSL/1.0.2h DAV/2 mod_fastcgi/2.4.6 mod_perl/2.0.9 Perl/v5.24.0
X-Powered-By: PHP/7.0.10
X-Pagination-Total-Count: 576
X-Pagination-Page-Count: 29
X-Pagination-Current-Page: 1
X-Pagination-Per-Page: 20
Link: <http://localhost:8888/api/items?page=1>;
Content-Type: application/json;
|
Запрос: Покажите мне запись 15:
1
|
curl -i «http://localhost:8888/api/items/15»
|
Отклик:
01
02
03
04
05
06
07
08
09
10
|
HTTP/1.1 200 OK
Date: Tue, 25 Oct 2016 23:19:27 GMT
Server: Apache/2.2.31 (Unix) mod_wsgi/3.5 Python/2.7.12 PHP/7.0.10 mod_ssl/2.2.31 OpenSSL/1.0.2h DAV/2 mod_fastcgi/2.4.6 mod_perl/2.0.9 Perl/v5.24.0
X-Powered-By: PHP/7.0.10
Content-Length: 203
Content-Type: application/json;
{«id»:15,»title»:»Jeff Reifman»,»path»:»jeffreifman»,
«detail»:»»,»status»:0,»posted_by»:1,»image_url»:»»,
«favorites»:0,»stat_1″:0,»stat_2″:0,»stat_3″:0,»created_at»:1477277956,»updated_at»:1477277956}
|
Запрос: Показать все данные на странице 3:
1
2
|
curl -i -H «Accept:application/json»
«http://localhost:8888/api/items?page=3»
|
Отклик:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
|
HTTP/1.1 200 OK
Date: Tue, 25 Oct 2016 23:30:21 GMT
Server: Apache/2.2.31 (Unix) mod_wsgi/3.5 Python/2.7.12 PHP/7.0.10 mod_ssl/2.2.31 OpenSSL/1.0.2h DAV/2 mod_fastcgi/2.4.6 mod_perl/2.0.9 Perl/v5.24.0
X-Powered-By: PHP/7.0.10
X-Pagination-Total-Count: 575
X-Pagination-Page-Count: 29
X-Pagination-Current-Page: 3
X-Pagination-Per-Page: 20
Link: <http://localhost:8888/api/items?page=3>;
Content-Length: 3999
Content-Type: application/json;
[{«id»:43,»title»:»_jannalynn»,»path»:»_jannalynn»,
«detail»:»»,»status»:0,»posted_by»:1,»image_url»:»»,
«favorites»:0,»stat_1″:0,»stat_2″:0,»stat_3″:0,
…
…
…
{«id»:99,»title»:»alibrown»,»path»:»alibrown»,»detail»:»»,
«status»:0,»posted_by»:1,»image_url»:»»,»favorites»:0,
«stat_1″:0,»stat_2″:0,»stat_3″:0,»created_at»:1477277956,
«updated_at»:1477277956}]
|
УДАЛИТЬ Запросы
Вот пример запроса GET, за которым следует запрос DELETE, а затем последующая неудачная попытка GET:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
$ curl -i -H «Accept: application/json» «http://localhost:8888/api/items/8»
HTTP/1.1 200 OK
Date: Tue, 25 Oct 2016 23:32:17 GMT
Server: Apache/2.2.31 (Unix) mod_wsgi/3.5 Python/2.7.12 PHP/7.0.10 mod_ssl/2.2.31 OpenSSL/1.0.2h DAV/2 mod_fastcgi/2.4.6 mod_perl/2.0.9 Perl/v5.24.0
X-Powered-By: PHP/7.0.10
Content-Length: 186
Content-Type: application/json;
{«id»:8,»title»:»aaker»,»path»:»aaker»,»detail»:»»,»status»:0,»posted_by»:1,»image_url»:»»,»favorites»:0,»stat_1″:0,»stat_2″:0,»stat_3″:0,»created_at»:1477277956,»updated_at»:1477277956}
$ curl -i -H «Accept: application/json» -X DELETE «http://localhost:8888/api/items/8»
HTTP/1.1 204 No Content
Date: Tue, 25 Oct 2016 23:32:26 GMT
Server: Apache/2.2.31 (Unix) mod_wsgi/3.5 Python/2.7.12 PHP/7.0.10 mod_ssl/2.2.31 OpenSSL/1.0.2h DAV/2 mod_fastcgi/2.4.6 mod_perl/2.0.9 Perl/v5.24.0
X-Powered-By: PHP/7.0.10
Content-Length: 0
Content-Type: application/json;
$ curl -i -H «Accept: application/json» «http://localhost:8888/api/items/8»
HTTP/1.1 404 Not Found
Date: Tue, 25 Oct 2016 23:32:28 GMT
Server: Apache/2.2.31 (Unix) mod_wsgi/3.5 Python/2.7.12 PHP/7.0.10 mod_ssl/2.2.31 OpenSSL/1.0.2h DAV/2 mod_fastcgi/2.4.6 mod_perl/2.0.9 Perl/v5.24.0
X-Powered-By: PHP/7.0.10
Content-Length: 115
Content-Type: application/json;
{«name»:»Not Found»,»message»:»Object not found: 8″,»code»:0,»status»:404,»type»:»yii\\web\\NotFoundHttpException»}
|
Запросы на удаленную запись возвращают ошибку 404.
POST-запросы
Для своих почтовых запросов я переключился на приложение Chrome Postman :
Зарегистрироваться на Почтальон было легко:
И тогда я смог отправить запросы в мой localhost API в более дружественном графическом интерфейсе:
Затем я получил данные с помощью curl, record 577
:
01
02
03
04
05
06
07
08
09
10
11
12
13
|
$ curl -i -H «Accept: application/json» «http://localhost:8888/api/items/577»
HTTP/1.1 200 OK
Date: Tue, 25 Oct 2016 23:40:44 GMT
Server: Apache/2.2.31 (Unix) mod_wsgi/3.5 Python/2.7.12 PHP/7.0.10 mod_ssl/2.2.31 OpenSSL/1.0.2h DAV/2 mod_fastcgi/2.4.6 mod_perl/2.0.9 Perl/v5.24.0
X-Powered-By: PHP/7.0.10
Content-Length: 219
Content-Type: application/json;
{«id»:577,»title»:»Jeff Reifman»,»path»:»reifman»,
«detail»:»A programmer on earth.»,»status»:0,
«posted_by»:1,»image_url»:»»,»favorites»:0,
«stat_1″:0,»stat_2″:0,»stat_3″:0,»created_at»:1477436477,
«updated_at»:1477436477}
|
Почтальон оказался необходимым для завершения моего тестирования, поскольку curl командной строки было нелегко настроить для отправки POST.
Заглядывая вперед
В дополнение к краткому обзору REST , документация по Yii 2.0 содержит подробную информацию о множестве других аспектов создания API:
- Ресурсы
- Контроллеры
- Маршрутизация
- Форматирование ответа
- Аутентификация
- Ограничение скорости
- Versioning
- Обработка ошибок
Я надеюсь, что у меня будет шанс изучить больше из них в будущих эпизодах. Но, безусловно, одним из следующих шагов является создание API для Meeting Planner в серии запуска .
В заключение, создание базового REST API с помощью инфраструктуры Yii MVC довольно просто. Команда Yii проделала большую работу по стандартизации функциональности для очень важного требования, REST API. Я надеюсь, вам понравилось узнавать о них.
Если у вас есть какие-либо вопросы или предложения, пожалуйста, оставьте их в комментариях. Если вы хотите быть в курсе моих будущих уроков Envato Tuts + и других серий, пожалуйста, посетите мою страницу инструктора или следуйте @reifman . Обязательно посмотрите мою серию стартапов и Планировщик собраний .