Статьи

Программирование на Yii2: создание RESTful API

Конечный продукт
Что вы будете создавать

В этой серии «Программирование с Yii2» я расскажу читателям, как использовать Yii2 Framework для PHP. Возможно, вас также заинтересует мое Введение в Yii Framework , в котором рассматриваются преимущества Yii и содержится обзор того, что нового в Yii 2.x.

В сегодняшнем руководстве я расскажу, как создать REST API в Yii для подключения вашего приложения к облаку, мобильным приложениям и другим службам. Я проведу вас через краткое руководство по REST API Yii и предоставлю контекст и примеры распространенных запросов.

Создание REST API в Yii на самом деле довольно просто. Вы можете использовать существующую инфраструктуру MVC, но вы создаете отдельную точку доступа, к которой вы собираетесь обращаться различными видами услуг (не посетителями сайта).

Yii Framework предоставляет широкую поддержку и подробную документацию для создания API. Вот некоторые из встроенных возможностей при создании API:

  • Быстрое создание прототипов с поддержкой общих API для Active Record . Это позволяет быстро и легко раскрыть функциональность CRUD модели данных через API.
  • Согласование формата ответа (с поддержкой JSON и XML по умолчанию). Есть встроенная поддержка для возврата данных в общих форматах вывода.
  • Настраиваемая сериализация объектов с поддержкой выбираемых полей вывода. Легко изменить, какие данные возвращаются.
  • Правильное форматирование сбора данных и ошибки проверки.
  • Поддержка гипермедиа как движок состояния приложения (HATEOAS)
  • Эффективная маршрутизация с правильной проверкой глагола HTTP.
  • Встроенная поддержка глаголов OPTIONS и HEAD .
  • Аутентификация и авторизация.
  • Кеширование данных и HTTP-кеширование.
  • Ограничение скорости.

У меня не будет возможности затронуть все это сегодня.

В этом эпизоде ​​я создам API, который позволит нам манипулировать таблицей «Предмет», которую я создал в сервисе Twixxr из этого учебника по API Twitter . Но я также планирую создать API для нашей серии учебных пособий для начинающих , Meeting Planner . Безопасный API будет необходим для создания приложения iOS для сервиса. API позволит установить связь между мобильным приложением и облачным сервисом.

С помощью инфраструктуры REST Yii мы создадим конечную точку для нашего API и организуем контроллеры для каждого типа ресурса.

Ресурсы — это, по сути, модели данных нашего приложения. Это расширение yii \ base \ Model .

Класс yii \ rest \ UrlRule обеспечивает готовую маршрутизацию, отображающую нашу модель данных на конечные точки API CRUD:

Программирование Yii2 REST API UrlRule Документирование конечных точек API CRUD

В расширенном шаблоне 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’);

В /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 для этих моделей.

Давайте начнем делать запросы.

Покажите мне доступные методы 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.

Для своих почтовых запросов я переключился на приложение Chrome Postman :

Программирование с помощью целевой страницы Yii2 Chrome

Зарегистрироваться на Почтальон было легко:

Программирование с Yii2 Postmand Зарегистрироваться

И тогда я смог отправить запросы в мой localhost API в более дружественном графическом интерфейсе:

Программирование с помощью Yii2 POST-запроса, показанного в UX Postman

Затем я получил данные с помощью 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:

Я надеюсь, что у меня будет шанс изучить больше из них в будущих эпизодах. Но, безусловно, одним из следующих шагов является создание API для Meeting Planner в серии запуска .

В заключение, создание базового REST API с помощью инфраструктуры Yii MVC довольно просто. Команда Yii проделала большую работу по стандартизации функциональности для очень важного требования, REST API. Я надеюсь, вам понравилось узнавать о них.

Если у вас есть какие-либо вопросы или предложения, пожалуйста, оставьте их в комментариях. Если вы хотите быть в курсе моих будущих уроков Envato Tuts + и других серий, пожалуйста, посетите мою страницу инструктора или следуйте @reifman . Обязательно посмотрите мою серию стартапов и Планировщик собраний .