7 days of WordPress plugins, themes & templates - for free!* Unlimited asset downloads! Start 7-Day Free Trial
Advertisement
  1. Code
  2. PHP

Робота зі службами RESTful в CodeIgniter

Scroll to top
Read Time: 13 mins

Ukrainian (українська мова) translation by Andy Yur (you can also view the original English article)

CodeIgniter добре відомий своєю міццю як фреймворка веб-додатків на PHP, але не так часто він використовується десь ще.  Сьогодні ми дізнаємося, як користуватися CodeIgniter при створенні RESTful API для веб-додатків і продемонструємо взаємодія з вашим власним API або іншими веб-сервісами RESTful, такими як Facebook і Twitter.

Деталі уроку

Вступ

Якщо ви стежите за серією CodeIgniter From Scratch, то вже знаєте, як відносно швидко і просто зібрати веб-додатки, такі як блоги, системи CMS, сайти брошур та інше. Те, про що ви, можливо, не думали - це використання CodeIgniter для створення інтерактивного API. Спробувавши декілька REST, я виявив, що вони не тільки не мають простоту, але і втрачають більшість функцій, яких ви очікуєте від реалізації RESTful; тому я побудував свій власний. В уроці показано, як використовувати цей код для настройки REST API, і дано приклад того, як взаємодіяти з ним з вашого веб-додатки.

Умови

  1. Ви маєте веб-сервер, локально або онлайн та знаєте, як управляти файлами на ньому.
  2. Ви прочитали кілька уроків CodeIgniter from Scratch.
  3. Ви знаєте, як налаштувати CodeIgniter.
  4. Ви трохи знайомі з сервісами RESTful.

Цей урок розбитий на дві частини. Ми почнемо з вивчення того, як створити службу RESTful, а потім навчимося взаємодіяти з нею кількома способами.

Частина 1 - Створення RESTful API

Крок 1. Налаштування демо-версії

По-перше, ви повинні завантажити код codeigniter-restserver з GitHub, витягти його і перенести на свій сервер.

Коли ви відкриєте папку, побачите повну установку CodeIgniter для включення демо. Це дозволяє пробувати демо-версію REST перед інтеграцією з існуючим додатком.

Відкрийте "application/config/config.php" і встановіть base_url для отримання посилань. Цей base_url будуть для всіх різними і повністю залежать від місця завантаження ваших файлів.

Крок 2. URL-адреси

З витягнутими файлами і набором base_url ми готові запустити установку RESTful CodeIgniter і ознайомитися із запропонованою демо-версією. Перегляньте базовий URL за замовчуванням:

http://localhost/restserver

Тут ви знайдете приклади посилань на контролер example_api, які можна знайти в "application/controllers/example_api.php". Давайте проаналізуємо URL-адреси цих прикладів, щоб побачити, що відбувається. Перший URL-адресу дуже простий.

Цей URL-адресу дуже схожий на будь-який інший URL-адресу CodeIgniter з контролером і методом, але ви побачите на цій діаграмі, що він називається "Resource". REST - це все про Resources і вони по суті іменники в вашому додатку, які взаємодіють (додаються, видаляються, редагуються, запитуються) на основі HTTP headers та рядків запиту URL або аргументів HTTP.

Формат виведення за замовчуванням - XML, який ми бачимо на цьому простому прикладі. Інші посилання трохи більше і демонструють, як передавати параметри і як формат виведення може бути змінений в URL:

Зазвичай в CodeIgniter ви просто передаєте значення параметрів, але контролер REST приймає будь-яку кількість параметрів в будь-якому порядку. Щоб це спрацювало, нам потрібно передати ім'я параметра, за яким слідує значення в парах.

В кінці URL-адреси знаходиться параметр "format". Це зарезервований параметр, який змінить формат виведення запитаних даних наступним чином:

Надаючи розробнику API і клієнтського додатку вибір форматів даних для використання, API відкритий для набагато більш широкої аудиторії і може використовуватися з великою кількістю мов програмування і систем. І це не єдині формати, на яких може працювати ваш REST API:

  • xml - практично будь-яку мову програмування може читати XML
  • json - підходить JavaScript і все більш для PHP-додатків.
  • csv - відкривається за допомогою spreadsheet програм
  • html - проста таблиця HTML
  • php - уявлення PHP-коду, який може бути eval()'ed
  • serialize - серійні дані, які можуть бути unserialized в PHP

Хоча додавання формату до URL-адресою технічно не є найкращим RESTful зміни форматів, але легко перевіряється браузером і дозволяє розробникам без cURL виконувати прості GET-запити для API. Більш RESTful спосіб - відправити Content-type HTTP header на контролер REST з використанням cURL, але це поясню пізніше.

Крок 3. Код

Після відкриття application/controllers/example_api.php ви відразу виявите декілька відмінностей від звичайних контролерів CodeIgniter.

REST_Controller

У шаблоні MVC контролер - центральна точка логіки. Він викликається за запитом користувача, а потім, грунтуючись на логіці в контролері, отримує дані і виводить уявлення. У CodeIgniter своя логіка того, як повинен працювати Controller, але оскільки ми робимо щось інше, нам потрібна власна бібліотека REST_Controller під власні логіки REST. Тому замість простого використання:

вам потребується використати:

Робота з ресурсами

Порожній контролер налаштований, за ним слідують методи чи "resources". Ймовірно, це сама плутана частина уроку, якщо ви звикли до роботи CodeIgniter. В основному беруть Resource і HTTP verb в комбінації для створення імені методу. Таким чином, два приклади, які ми розглянули раніше, мали Resource user та users. Оскільки обидва вони були завантажені в браузері, ми знаємо, що він використовував GET request і тому використовуються два наступних методу:

Це може здатися трохи дивним, але дає можливість використовувати один і той же URL і відповідати на запит в залежності від використовуваного HTTP verb. Якщо хтось намагається отримати доступ до вашого API забороненим способом (у цьому прикладі PUT або DELETE), він отримає 404. Якщо ви не сильні в HTTP verbs, дозвольте мені пояснити.

GET

Використовується для добування інформації о ресурсі, що вже є. Це використовується браузерами, коли ви вводите URL і натискаєте «go», або коли ви натискаєте на посилання, тому він ідеально підходить для добування інформації про один з ваших ресурсів REST (наприклад, користувача).

POST

Використовується для оновлення інформації про існуючий ресурсі. Браузери використовують це для відправки більшості типів форм в Інтернеті, хоча деякі використовують і GET, відправляючи дію форми за допомогою рядка запиту, що містить дані поля.

PUT

Менш вживається і не підтримуваний більшістю браузерів, PUT потрібен для створення нового ресурсу.

DELETE

Також не використовується багатьма браузерами, цей HTTP verb, швидше за все, потрібен для видалення ресурсу.

Якщо ми помістимо в код і заявимо кожен verb на ресурс user, це буде виглядати так:

Доступ до параметрів та повернення даними

Отже, тепер API отримав свою структуру, налаштовуючи ресурси і визначаючи метод для кожної HTTP verb, який ми хочемо підтримувати; нам потрібні параметри, щоб ми могли використовувати моделі і бібліотеки CodeIgniter. Це одне з основних переваг використання CodeIgniter для API, оскільки ми можемо використовувати наші існуючі моделі і бібліотеки і не перекодувати їх.

Цей приклад містить п'ять нових фрагментів коду:

$this->get()

Використовується для повернення змінних GET з рядка запиту, наприклад index.php/example_api/user?Id=1 або може бути встановлений CodeIgniter в більш складному режимі за допомогою index.php/example_api/user/id/1.

$this->post()

Є псевдонімом для $this->input->post(), який є методом CodeIgniter для доступу до змінних $_POST із захистом XSS.

$this->put()

Зчитує аргументи PUT, встановлені в HTTP headers або через cURL.

$this->delete()

Ви здогадалися, що це читається в аргументах DELETE, також заданих в HTTP headers або через cURL.

$this->response()

Відправляє дані в браузер в будь-якому запрошенном форматі даних або за замовчуванням в XML. Ви можете опціонально передати код статусу HTTP, щоб показати, що він працював або не пройшов. Наприклад, якщо наданий ID не був у базі даних, ви можете використовувати $this->response(array ('error'=>'User not found.'),  404);

Крок 4. Робота з вашими моделями

До цього часу ми працювали з прикладом API в чистій установці. Наступний крок - запустити REST API з існуючої кодової бази.

Хоча завантаження йде з повною установкою CodeIgniter для демонстрації і дозволяє створювати API з нуля, важливі тільки два файли:

  1. application/config/rest.php
  2. application/libraries/REST_Controller.php

Скиньте ці два файли в ваш додаток CodeIgniter і створіть новий контролер API.

Тут показаний приклад API з деякими родовими іменами моделей. У першому методі ми підбираємо ?Id=XX і передаємо його моделі. Якщо дані знайдені, ми відправляємо їх в функцію $this->response() зі статусом 200. Якщо нічого не знайдено, що не повертайте ніякого body, а 404, щоб сказати, що нічого не знайдено. Можете подумати над розширенням, щоб запускати всі види діяльності API вашого веб-додатки.

Крок 5. Забезпечення безпеки API.

Тепер ваш API побудований, він потребує захисту, щоб тільки користувачі, яким надається доступ, могли взаємодіяти з API. Щоб встановити тип входу, імена користувачів і паролі, відкриємо "application/config/rest.php" вашої кодової бази.

None

Будь-хто може взаємодіяти з будь-яким з ваших контролерів API.

Basic

Щодо ненадійний метод входу в систему, який повинен використовуватися тільки для внутрішніх/захищених мереж.

Digest

Більш безпечний метод входу в систему, який шифрує імена користувачів і паролі. Якщо ви хочете мати захищений API, який може отримати кожен, використовуйте дайджест.

Просте налаштування користувачів. Кожен вхід в систему є елементом масиву з ключем і значенням. Ключ - ім'я користувача, а значення - пароль. Додайте в масив стільки, скільки захочете і відправте всім, хто буде використовувати API.

Частина 2 - Взаємодія з сервісами RESTful

Будь то API, який ви тільки що побудували або громадський сервіс, такий як Twitter, ви захочете якось взаємодіяти з ним. Якщо побачити, як служби RESTful працюють з базовими HTTP-запитами, дуже легко зробити це кількома різними способами.

Різні методи взаємодії з REST

Кожен з цих методів взаємодії буде показаний з кодом, розміщеним безпосередньо в Controller methods. Це тому, що зразок легше читати, а зазвичай розміщуються всередині моделі або бібліотеки для правильного поділу MVC.

file_get_contents()

Використовуючи дуже просту функцію PHP file_get_contents(), ви можете виконати базовий GET-запит. Це найпростіший з усіх методів, але варто згадати про «швидкі та брудні» моменти.

Варто відзначити, хоча цей метод не буде працювати з використанням HTTP Digest, якщо ви використовуєте HTTP Basic аутентифікацію, можете призначити наступний синтаксис для отримання даних із захищеного паролем RESTful API:

Є кілька проблем з цим методом: єдиний спосіб встановити додаткові HTTP headers - зробити це вручну за допомогою PHP функції stream_context_create(), що може бути дуже складним для новачків у розробці HTTP-запитів. Іншим недоліком є ​​отримання тільки body відповіді HTTP в його необробленому форматі, значить, вам потрібно зробити перетворення єдиного запиту.

cURL

CURL - самий гнучкий спосіб взаємодії з REST API, оскільки він був розроблений саме для такого роду речей. Ви можете встановити HTTP headers, параметри HTTP і багато іншого. Ось приклад того, як оновити користувача за допомогою наших example_api та cURL, щоб зробити запит POST:

Взаємодія з вашим API прекрасно працює, але є дві проблеми з цим методом:

  1. Він використовує потворний плутаний синтаксис - уявіть собі створення декількох додатків на його основі.
  2. За замовчуванням cURL не встановлено на всіх серверах.

Для позбавлення від цього потворного синтаксису CodeIgniter, була розроблена бібліотека cURL, яка дуже спрощує речі.

Точно такий же запит, зроблений з бібліотекою cURL, буде виглядати так:

Набагато приємніше дивитися? Ну, є ще простіший спосіб працювати з REST в ваших додатках CodeIgniter, ніж це.

Клієнтська бібліотека REST

Була розроблена REST client library, яка знаходиться нагорі бібліотеки cURL для обробки перетворення формату, HTTP logins та інших аспектів вашого REST API.

Тут видно, що ми робимо запит GET, відправляючи id як параметр і повідомляючи бібліотеці, що ми хочемо, щоб 'json' був форматом вмісту. Він обробляє для вас налаштування Content-type і перетворює дані в об'єкт PHP. Ви можете змінити це значення на 'xml', 'json', 'serialize', 'php', 'csv' або будь-який призначений для користувача MIME-тип, який вам подобається, наприклад:

Як ви, мабуть, здогадалися, як і $this->rest->get(), бібліотека також підтримує $this->rest->post(), $this->rest->put(), $this->rest->delete() щоб відповідати всім вашим методам REST_Controller.

Вам знадобиться var_dump() результати, отримані з REST client library, щоб переконатися, що ви повертаєте правильний формат даних. Перетворення іноді буде масивом, а іноді і об'єктом, в залежності від того, як він перетворюється за допомогою PHP. Якщо повертається MIME-тип не підтримується, він просто повертає формат у вигляді звичайного тексту.

Спілкування з Twitter

За допомогою цієї бібліотеки REST ви можете спілкуватися з іншими службами RESTful, такими як Twitter і Facebook. Ось простий приклад того, як можна отримати інформацію про конкретного користувача на основі його ID, використовуючи Twitter формат XML за замовчуванням.

Дивлячись на це, ви помітите, що взаємодія з API Twitter відрізняється в декількох аспектах.

  1. Вони підтримують перемикання на основі URL-адрес в форматі .json замість /format/json. Деякі вимагають розширення, інші - ні; тому краще завжди їх додавати.
  2. Вони в основному підтримують тільки GET/POST, але починають додавати методи DELETE
  3. У них не завжди є ресурс в URL, наприклад: users/search - один REST-метод, але lists - це інший.

Слідкуйте за цими відмінностями, так як вони можуть вас зловити. Якщо ви застрягли, знову $this->rest->debug() для всього діапазону інформації про вашому REST-запиті.

Підсумки

Об'єднавши інформацію про службах RESTful, клієнтської бібліотеці RESTful CodeIgniter і Twitter API documentation, а також будь-яку іншу документацію RESTful API, ви можете створити дуже потужні програми, які інтегруються з будь-якими налаштованим або загальнодоступними веб-службами за допомогою REST. Ви можете розширити свій API, створивши більше REST_Controller або модульний API, використовуючи Matchbox або Modular Separation, щоб створити контролер api.php для кожного модуля і підтримки API як акуратно організованого додатки.

Напишіть урок

Ви знаєте, що можете заробити до $600 за написання уроку PLUS та/або відеоролика для нас? Ми шукаємо глибокі і добре написані допомоги по HTML, CSS, PHP і JavaScript. Якщо ви здатні на це, то зв'яжіться з Jeffrey за адресою nettuts@tutsplus.com.

Зверніть увагу, що компенсація буде залежати від якості уроку та його скрінкастів.

Write a PLUS tutorial
  • Слідуйте за нами на Twitter або підпишіться на Nettuts+ RSS Feed для отримання кращих навчальних матеріалів по веб-розробці в Інтернеті.
Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.