Progress28.ru

IT Новости
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Php web services

Веб-сервисы в теории и на практике для начинающих

Что такое веб-сервисы?

Прежде всего, веб-сервисы (или веб-службы) — это технология. И как и любая другая технология, они имеют довольно четко очерченную среду применения.

Если посмотреть на веб-сервисы в разрезе стека сетевых протококолов, мы увидим, что это, в классическом случае, не что иное, как еще одна надстройка поверх протокола HTTP.

С другой стороны, если гипотетически разделить Интернет на несколько слоев, мы сможем выделить, как минимум, два концептуальных типа приложений — вычислительные узлы, которые реализуют нетривиальные функции и прикладные веб-ресурсы. При этом вторые, зачастую заинтересованы в услугах первых.

Но и сам Интернет — разнороден, т. е. различные приложения на различных узлах сети функционируют на разных аппаратно-программных платформах, и используют различные технологии и языки.

Чтобы связать все это и предоставить возможность одним приложениям обмениваться данными с другими, и были придуманы веб-сервисы.

По сути, веб-сервисы — это реализация абсолютно четких интерфейсов обмена данными между различными приложениями, которые написаны не только на разных языках, но и распределены на разных узлах сети.

Именно с появлением веб-сервисов развилась идея SOA — сервис-ориентированной архитектуры веб-приложений (Service Oriented Architecture).

Протоколы веб-сервисов

На сегодняшний день наибольшее распространение получили следующие протоколы реализации веб-сервисов:

  • SOAP (Simple Object Access Protocol) — по сути это тройка стандартов SOAP/WSDL/UDDI
  • REST (Representational State Transfer)
  • XML-RPC (XML Remote Procedure Call)

На самом деле, SOAP произошел от XML-RPC и является следующей ступенью его развития. В то время как REST — это концепция, в основе которой лежит скорее архитектурный стиль, нежели новая технология, основанный на теории манипуляции объектами CRUD (Create Read Update Delete) в контексте концепций WWW.

Безусловно, существуют и иные протоколы, но, поскольку они не получили широкого распространения, мы остановимся в этом кратком обзоре на двух основных — SOAP и REST. XML-RPC ввиду того, что является несколько «устаревшим», мы рассматривать подробно не будем.

Нас в первую очередь интересуют вопросы создания новых веб-служб, а не реализация клиентов к существующим (как правило поставщики веб-сервисов поставляют пакеты с функциями API и документацией, посему вопрос построения клиентов к существующим веб-службам менее интересен с точки зрения автора).

SOAP против REST

Проблемы данного противостояния хорошо описаны в статье Леонида Черняка, найденой на портале www.citforum.ru.

По мнению же автора, кратко можно выделить следующее:

SOAP более применим в сложных архитектурах, где взаимодействие с объектами выходит за рамки теории CRUD, а вот в тех приложениях, которые не покидают рамки данной теории, вполне применимым может оказаться именно REST ввиду своей простоты и прозрачности. Действительно, если любым объектам вашего сервиса не нужны более сложные взаимоотношения, кроме: «Создать», «Прочитать», «Изменить», «Удалить» (как правило — в 99% случаев этого достаточно), возможно, именно REST станет правильным выбором. Кроме того, REST по сравнению с SOAP, может оказаться и более производительным, так как не требует затрат на разбор сложных XML команд на сервере (выполняются обычные HTTP запросы — PUT, GET, POST, DELETE). Хотя SOAP, в свою очередь, более надежен и безопасен.

В любом случае вам решать, что больше подойдет вашему приложению. Вполне вероятно, вы даже захотите реализовать оба протокола, чтобы оставить выбор за пользователями службы и — это ваше право.

Практическое применение веб-сервисов

Поскольку речь идет о практическом применении, нам нужно выбрать платформу для построения веб-службы и поставить задачу. Так как автору ближе всего PHP 5, мы и выберем его в качестве технологии для построения службы, а в качестве задачи примем следующие требования.

Допустим, нам необходимо создать службу, предоставляющую доступ к информации о курсах валют, которая собирается нашим приложением, и накапливается в базе данных. Далее посредством веб-сервиса, данная информация передается сторонним приложениям для отображения в удобном для них виде.

Как видим задача довольно проста и, с точки зрения самой службы, ограничивается лишь чтением информации, но в практических целях нам этого будет достаточно.

Этап первый — реализация приложения сбора информации о курсах валют.

Информацию о курсах валют мы будем собирать со страниц сайта НБУ (Национального Банка Украины) ежедневно и складывать в базу данных под управлением СУБД MySQL.

Создадим структуру данных.

Таблица валют (currency):

Таблица номиналов обмена (exchange):

Для работы с базой данных воспользуемся ORM слоем на базе пакета PHP Doctrine. Реализуем граббер:

класс Grubber (models/Grabber.php):

и сам граббер (grabber.php):

Теперь заставим наш граббер отрабатывать раз в сутки в 10:00 утра, путем добавления команды запуска граббера в таблицы cron:

Все — у нас есть достаточно полезный сервис.

Теперь реализуем веб-сервис, который позволит другим приложениям извлекать данные из нашей базы.

Реализация SOAP сервиса

Для реализации веб-сервиса на базе SOAP протокола, мы воспользуемся встроенным пакетом в PHP для работы с SOAP.

Поскольку наш веб-сервис будет публичным, хорошим вариантом будет создание WSDL файла, который описывает структуру нашего веб-сервиса.

WSDL (Web Service Definition Language) — представляет из себя XML файл определенного формата. Подробное описание синтаксиса можно найти здесь.

На практике будет удобно воспользоваться функцией автоматической генерации файла, которую предоставляет IDE Zend Studio for Eclipse. Данная функция позволяет генерировать WSDL файл из классов PHP. Поэтому, прежде всего, мы должны написать класс, реализующий функциональность нашего сервиса.

класс CurrencyExchange (models/CurrencyExchange.php):

Отметим, что для автоматической генерации WSDL, нам необходимо написать комментарии в стиле javadoc, потому что именно в них мы прописываем информацию о типах принимаемых аргументов и возвращаемых значений. Неплохо также описывать в нескольких словах работу методов — ведь WSDL послужит описанием API для сторонних разработчиков, которые будут использовать ваш веб-сервис.

Не пишите в докблоках param void или return void — для WSDL это не критично, но вот при реализации REST доступа к тому-же классу у вас возникнут проблемы.

Теперь в Zend Studio входим в меню File->Export. выбираем PHP->WSDL, добавляем наш класс, прописываем URI-адрес нашего сервиса и создаем WSDL-файл. Результат должен быть примерно таким: http://mikhailstadnik.com/ctws/currency.wsdl

Если вы будете добавлять новую функциональность в ваш веб-сервис, вам нужно будет пересоздавать WSDL-файл. Но здесь не так все гладко. Следует учитывать, что SOAP-клиент, который уже запрашивал ваш WSDL файл, кеширует его на своей стороне. Поэтому, если вы замените старое содержимое новым в WSDL файле, некторые клиенты его не прочтут. А значит, при добавлении новой функциональности, дописывайте версию в имя вашего файла. И не забудбте обеспечить обратную совместимость для старых клиентов, особенно если вы не являетесь их поставщиком.

С другой стороны, WSDL довольно жестко задает структуру веб-сервиса, а это значит, что, если существует необходимость ограничить функциональность клиента по сравнению с сервером, вы можете не включать определенные методы ваших классов в WSDL. Таким образом они не смогут быть вызваны, несмотря на то, что существуют.

Реализация же самого сервера не предстваляет теперь никакой сложности:

Вы можете попробовать веб-сервис в работе по адресу: http://mikhailstadnik.com/ctws/
Там же доступен тестовый клиент: http://mikhailstadnik.com/ctws/client.php

Код простейшего клиента может быть таким:

Реализация REST сервиса

REST — это не стандарт и не спецификация, а архитектурный стиль, выстроенный на существующих, хорошо известных и контролируемых консорциумом W3C стандартах, таких, как HTTP, URI (Uniform Resource Identifier), XML и RDF (Resource Description Format). В REST-сервисах акцент сделан на доступ к ресурсам, а не на исполнение удаленных сервисов; в этом их кардинальное отличие от SOAP-сервисов.

И все же удаленный вызов процедур применим и в REST. Он использует методы PUT, GET, POST, DELETE HTTP протокола для манипуляции объектами. Кардинальное отличие его от SOAP в том, что REST остается HTTP-запросом.

Поскольку в PHP пока еще нет реалзации REST, мы воспользуемся Zend Framwork, в который включена реализация как REST клиента, так и REST севера.

Воспользуемся уже готовым классом CurrencyExchange. Напишем сам сервер:

Как видите все очень сходно и просто.

Однако, следует оговорить, что наш REST-сервис менее защищен, чем SOAP-сервис, так как любой добавленый метод в класс CurrencyExchange при его вызове отработает (сам класс определяет сруктуру сервиса).

Проверим работу нашего сервиса. Для этого достаточно передать параметры вызова метода в сроке GET-запроса:

При желании или необходимости вы можете самомтоятельно задавать структуру ваших XML ответов для сервиса REST. В этом случае, также будет необходимо позаботиться и о создании определения типа вашего XML документа (DTD — Document Type Definition). Это будет минимальным описанием API вашего сервиса.

Простейший тестовый клиент к REST сервису может быть в нашем случае таким:

В принципе, Zend_Rest на сегодняшний день нельзя назвать наиболее точной реализацией принципов REST. Утрируя, можно говорить о том, что эта реализация свелась к удаленному вызову процедур (RPC), хотя философия REST гораздо шире.

Вы можете скачать пример в исходных кодах c PHP Doctrine и Zend Framework (4,42 Мб).

Заключение

Мы выполнили задачу минимум и показали, что такое веб-сервисы, для чего они нужны и как их реализовывать. Естественно, приведенный пример, возможно, несколько оторван от жизни, но он был выбран лишь в качестве инструмента для объяснения предмета и сущности веб-сервисов.

Читать еще:  Guest list php node

Кроме того мы увидели, что реализация веб-сервиса — задача довольно простая при использовании современного инструментария, который позволяет сконцентрироваться, в первую очередь, на разработке функциональности самого сервиса, не заботясь о низкоуровневой реализации протоколов.

Автор надеется, что данный материал будет действительно полезен тем, кто становится на тропу разработки веб-служб.

Статьи

Никитин Иван
ZCE, MCSD
ivan[at]nikitin.org

В статье http://www.phpworld.ru/articles/soapclient.php Леонид Лукин очень хорошо показал как можно просто и легко создать клиента Веб-сервиса для вызова удаленной службы и получения данных от внешнего сервера. Я лишь хотел бы дополнить указанную статью небольшими практическими примерами.

Веб-сервисы Microsoft .Net

В последнее время Веб-сервисы получили достаточно широкое распространение, и применяются в самых разных качествах: от простого предоставления справочных данных в Сеть, например, данных о прилете самолетов (Веб-сервис аэропорта Шереметьево), курсов валют и драгоценных металлов (Центральный Банк России) до работы с кредитными карточками (процессинговый центр Assist) и онлайновых переводов текста (Веб-сервис компании Prompt). Еще больше существует корпоративных Веб-сервисов, которые решают самые разные корпоративные задачи.

Я думаю, что такому широкому распространению Веб-сервисов немало способствовала технология Microsoft .Net. Дело в том, что создать Веб-сервис в той же Microsoft Visual Studio .Net 2003 невероятно просто. Грубо говоря, достаточно написать свой класс, унаследованный от класса System.Web.Services.WebService и объявить его методы как Веб-методы. И все! Компилируйте, переносите на рабочий сервер и ваш новый Веб-сервис готов к работе!

Так же просто написать и клиента для любого Веб-сервиса. В состав средств разработки Microsoft входит утилита wsdl.exe. Достаточно ей указать адрес WSDL документа, желаемый язык разработки (C#, VB.Net) и она сгенерирует вам код класса, который является прокси-классом для указанного Веб-сервиса, то есть его клиентом. То есть вы получаете готовый к использованию класс с тем же набором методов, что и Веб-сервис. Любое обращение к этим методам автоматически транслируется Веб-сервису и ответ Веб-сервиса возвращается как результат. Приложение даже не знает, что оно работает с Веб-сервисом, для приложения это просто обращение к локальному классу.

Все это очень значительно упрощает разработку и поэтому большинство Веб-сервисов, по крайней мере, в России, написаны именно на каком-нибудь языке .Net и работают именно на платформе .Net.

Узнать Веб-сервис .Net достаточно просто. Во-первых, файл, к которому происходит обращение, имеет расширение asmx, а во-вторых, при простом обращении к этому файлу (метод GET), Веб-сервис .Net генерирует HTML страничку с описанием своих методов, что тоже достаточно удобно. К тому же, Веб-сервисы .Net могут отвечать не только на запросы SOAP, но и на обычные запросы POST и GET. Но это больше дополнительные возможности, «фичи», которые к тому же, могут быть отключены разработчиком, и нами здесь не рассматриваются.

Однако при попытке использования Веб-сервисов .Net разработчик PHP может столкнуться с рядом проблем, решение которых мы здесь и покажем. В качестве примера мы создадим на PHP клиента Веб-сервиса Центрального Банка России и будем получать от него актуальные курсы валют на любую дату.

Написание любого Веб-сервиса начинается с изучения WSDL документа – описания самого Веб-сервиса, его методов, параметров методов и типов данных. Для Веб-сервисов .Net WSDL описание генерируется автоматически, достаточно обратится к Веб-сервису с параметром «?wsdl» в строке URL:
http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx?wsdl

Если внимательно изучить данный документ, будет ясно происхождение первой проблемы, с которой сталкиваются разработчики PHP при попытке вызова Веб-сервиса .Net с помощью класса SoapClient, а именно, как передавать параметры в метод Веб-сервиса. Вторая же проблема, как читать ответ Веб-сервиса, также объясняется документом WSDL.

Для получения данных о курсах валют вы будем использовать метод Веб-сервиса GetCursOnDateXML, который, судя, по описанию, должен реализовать «Получение ежедневных курсов валют (как XMLDocument)». Найдем этот метод в WSDL описании:

Получение ежедневных курсов валют (как XMLDocument)

Обратите внимание на описание входных и выходных сообщений, то есть, какие параметры и какого типа требуются этому Веб-сервису при вызове, и что собственно он вам вернет. Рассмотрим эти сообщения:

Обратите внимание, что оба сообщения являются complexType (комплексный тип), который состоит из sequence (последовательности) элементов. Если сказать по-другому, то это объекты с наборами свойств.

Дело в том, что для унификации описания своих методов, платформа .Net использует прием, при котором предполагается, что любой метод получает единственный параметр при вызове, и этот параметр – объект, у которого определены свойства с именами аргументов вызова – это, собственно, сами аргументы вызова. При ответе метод вернет вам объект, у которого есть единственное свойство с именем названиеМетодаResult. Тип этого свойства зависит от описания Веб-метода, точнее от того, что он вам возвращает. Если это простой тип – то он будет определен как скалярный тип (строка, число, логический), если сложный (например, массив данных), то он будет определен как ассоциативный массив с элементом any или отдельной схемой данных (например, если Веб-сервис возвращает набор данных System.Data.Dataset).

Именно это и надо учитывать при реализации клиента на PHP. Однако, это не так сложно, как может показаться на первый взгляд. При вызове метода мы должны просто создать ассоциативный массив с любым именем, заполнить его элементами, для которых имена – это названия параметров, а значения – значения этих параметров. И именно этот массив и передавать Веб-сервису. Ответ же читать из свойства названиеМетодаResult, если этот простой (скалярный тип) или из свойства названиеМетодаResult->any, если в WSDL описании вы видите строки:

Если же в описании ответа вы видите что-то вроде этого:

То, скорее всего, речь идет о возврате Вам класса Dataset, разбор которого хоть и не сложен, но все же является темой отдельной статьи.
Давайте попробуем реализовать вызов Веб-сервиса .Net на практике, и мы увидим, что это очень даже просто.

Клиент Веб-сервиса Центробанка России

Итак, нам для этого понадобится PHP5 , с подключенным модулем SOAP. Создадим класс CBR:

class CBR
<
// WSDL службы Центробанка
const WSDL = «http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx?WSDL»;
// Экземпляр класса SoapClient
protected $soap;
// Первоначальная инициализация
public function __construct()
<
$this->soap = new SoapClient(CBR::WSDL);
>
>

Вызов метода Веб-сервиса

Для того, чтобы вызывать метод GetCursOnDateXML, нам необходимо передавать ему параметр On_date, причем этот параметр имеет тип dateTime. Это видно из описания WSDL:

Представление даты и времени при SOAP вызовах описано в документе http://www.w3.org/TR/xmlschema-2/#dateTime, мы же напишем функцию, которая будет делать такое преобразование:

// Параметры:
// $timeStamp — дата/время в формате UNIX
// $withTime — необязательно если true,
// то преобразование вместе со временем суток,
// иначе только дата
function getSOAPDate($timeStamp, $withTime = false)
<
$soapDate = date(«Y-m-d», $timeStamp);
return ($withTime) ?
$soapDate . «T» . date(«H:i:s», $timeStamp) :
$soapDate . «T00:00:00»;
>

Теперь, собственно и можно произвести вызов Веб-сервиса

// Метод возвращает XML строку с результатами вызова Веб-службы
// Параметры:
// $date — дата, на которую производится запрос
function getXML($date)
<
// Строка даты, на которую производится вызов
$currentDate = $this->getSOAPDate($date);
// Формируем массив параметров
$params[«On_date»] = $currentDate;
// Вызов Веб-службы
$response = $this->soap->GetCursOnDateXML($params);
// Возвращаем результат
return $response->GetCursOnDateXMLResult->any;
>

Обратите внимание, параметр вызова On_date формируется как элемент ассоциативного массива $params, который передается Веб-сервису. Ответ (XML строку) мы считываем из свойства $response->GetCursOnDateXMLResult->any, что определяется WSDL описанием.

В результирующем коде я немного усложнил этот метод: я сохраняю полученную дату в свойстве класса, и ответ сервиса также сохраняю, а перед вызовом просто проверяю, был ли предыдущий вызов на эту же дату, и если да, то реальный вызов не производится, а возвращается просто предыдущий (сохраненный) результат. Это сделано для ускорения работы: каждый вызов Веб-сервиса – это довольно медленное сетевое взаимодействие с удаленным сервером. Кроме того, настоятельно рекомендую включить кэширование WSDL документов для модуля SOAP. Это можно сделать в настройках php.ini или в файле .htaccess:

[soap]
; Enables or disables WSDL caching feature.
soap.wsdl_cache_enabled=1
; Sets the directory name where SOAP extension will put cache files.
soap.wsdl_cache_dir=»C:WindowsTemp»
; (time to live) Sets the number of second while cached file will be used
; instead of original one.
soap.wsdl_cache_ttl=86400

В этом случае при каждой инициализации вашего класса (при создании экземпляра класса SoapClient) PHP не будет запрашивать WSDL с удаленного сервера, а будет брать его из кеша, что также положительно скажется на быстродействии.

Разбор XML строки – ответа Веб-сервиса

Итак, мы получили строку XML, как результат вызова Веб-сервиса Центробанка России. В этом XML документе содержатся данные о курсах валют на указанную дату. Если просто напечатать результат на экране (или вывести в файл), то можно увидеть его структуру:

Австралийский доллар
1
20.8448
36
AUD

. . .

Как говорится, пояснения излишни. Попробуем разобрать его и получить данные для требуемой валюты. Для разбора этого XML документа я воспользовался модулем SimpleXML, который входит в PHP5. Модуль SimpleXML я выбрал по двум причинам: во-первых, он быстрый и удобный для простого анализа XML документов, во-вторых, у него есть очень удобный метод XPath, который позволяет выбрать узлы документа по XPath выражению. Конечно же, все тоже самое можно сделать и стандартным DOM анализом, но с помощью SimpleXML код получается короче. Напишем функцию выборки курса валюты по ее коду:

Читать еще:  M pi php

// Параметры:
// $currencyCode — код валюты: USD, EUR и т.п.
// $date — необязательно, дата, на которую производится запрос,
// 0 — сегодня
function getRate($currencyCode, $date = 0)
<
if (!$date) $date = time();
$xml = simplexml_load_string($this->getXML($date));
$xPath = «/ValuteData/ValuteCursOnDate[VchCode=»$currencyCode»]»;
$result = $xml->xpath($xPath);
if (count($result) == 0) return 0;
return $result[0]->Vcurs / $result[0]->Vnom;
>

Видно, что мы получаем два параметра: код валюты и дату (дата необязательна), производим запрос с помощью функции getXML и ответ загружаем в объект SimpleXML. Далее, формируем XPath выражение для выборки узла ValuteCursOnDate по значению узла VchCode. Как результат метод $xml->xpath возвращает массив выбранных узлов. Если массив пуст – значит такого кода валюты в ответе нет. Если же код есть, то 0-й элемент массива – это наша валюта. Возьмем ее курс и разделим на номинал.

Все, текущий курс получен.

В конечном коде я еще написал метод, который формирует в классе ассоциативный массив кодов валют и их названий. Данный метод вызывается в конструкторе класса, что стразу же создает этакий справочник по кодам валют, как свойство класса (например, $cbr-> currencyCodes). Им удобно пользоваться например, вот для такой страницы:

PHP RESTful Web Service API – Part 1 – Introduction with Step-by-step Example

This is part 1 of a three part series to help you learn RESTful web services using PHP. These tutorials will be comprehensive, by following it through you can build your own web services easily and consume external services.

In this tutorial, we will see how to create PHP RESTful web service without using any framework. Most of the times I do prefer to write custom code without depending on frameworks since this approach has lot of advantages. Mainly, this will take you deeper in learning the concepts and you can keep things sleek and effective.

REST or Representational State Transfer is one of the popular architectural style used to develop web services. This style of architecture contains constraints or rules to design web services which can be accessed from external apps or web applications.

The objective of this PHP RESTful web service example

The objective is to build a RESTful web service in PHP to provide resource data based on the request with the network call by the external clients. Also, the following list of steps are implemented while customizing this example without depending on any framework.

  • Create request URI with patterns that follow REST principles.
  • Make the RESTful service to be capable of responding to the requests in JSON, XML, HTML formats.
  • Demonstrate the use of HTTP Status code based on different scenarios.
  • Demonstrate the use of Request Headers.
  • Test the RESTful web service using a REST client.

How it is made?

An array of mobile names are the resource data that will be targeted by the REST clients. I have this resource in a domain class of this PHP RESTful example.

For accessing these data via this web service, the client will send the request by setting URI, parameters with the selected method, and more information.

The resource handlers of the web service will prepare the response in JSON, XML or HTML format based on the request. Then, the response will be sent to the client.

On the Internet, I have seen web services tutorials and most of the times they all turn out to be error-prone or incomplete. I tested those RESTful services using a REST client and mostly they fail.

What is inside?

What is RESTful?

REST stands for Representational State Transfer and it is an architectural style that enables communication between systems. The term REST was first coined by Roy T. Fielding in his PhD. dissertation.

The concept of REST is defined by certain rules, constraints or principles. The system, application, services or whatever satisfies these REST principles are called RESTful.

Web services that follow the RESTful principles are RESTful services. The URI is used to access RESTful services to get the resources.

In the RESTful glossary, the resources are nothing but the data and functions. So eventually we will call the web services via URI to access functions and thereby get the resource data.

REST Constraints

The following constraints define the RESTfulness of an application or service.

  • Client-Server architecture
  • Statelessness
  • Uniform interface
  • Layered system
  • Cacheability
  • Code on Demand

RESTful web services vs RPC web services

The following table shows the comparison of RESTful and RPC style web services. This comparison is made by factors like service request URI, request methods, data transmission, service handlers and more.

RESTful-StyleRPC-Style
Request URIThe request URI will differ based on the resource.Same URI for all resources.
Request methodsThe service request parameters can be sent via GET, PUT, POST request methods.Supports only the POST method.
Service methods or handlersSame method for all resources.Methods and params are posted on request.
Target onThe service request using this style targets resources.The target is methods.
Response data transmissionOver HTTPwrapped with the requested methods and params.

RESTful web services API architecture

The following diagram shows a RESTful web service architecture. In this diagram, the request-response flow among the client-server is represented.

In this diagram, the database is shown as a resource. Based on the web service the resource can be XML feed, JSON data extracted from the file system or any.

Uses of RESTful API

RESTful API provides services to access resources from external applications or REST clients. Some of the predominant uses of the RESTful API is listed below.

  • As an interface with multi-platform support which is used to access resources from outside application coded in various programming languages like PHP, JAVA, Android and more.
  • REST is the simple architectural style for transmitting data over HTTP.
  • The REST API is the most suitable resource provider for an AJAX-based application interface which requires data to update UI without page reload.
  • By meeting more the REST constraints, the web applications or services can support a wide range of clients.

PHP RESTful web service example

In the PHP RESTful web service example, the following domain class contains the resource data array and service handlers. These handlers are called based on the request sent by the REST client or external apps.

In the next section, we can see all the file structure and the purpose of each file of this example.

File structure of RESTful example service

Below file structure shows the simplicity of creating a RESTful web service example.

As discussed above the Mobile.php is the domain class which is having resource array and handlers to get the resource.

The .htaccess file is used for mapping the request URI to the REST service endpoint.

In the following sections, we will see how the URI is mapped, how the service handler is invoked to get resource data from the domain. – URI RFC 3986

RESTful services URI mapping

Every resource is identified via a URI (Uniform Resource Identifier).

A Uniform Resource Identifier (URI) is a compact sequence of characters that identifies an abstract or physical resource.

RestController.php shown in the above file structure is the PHP endpoint to which the request is to be forwarded.

In this example, I provide two URIs for accessing this web service from external applications or REST client. One URI will be used to get the complete array of mobile names in a JSON format and the other is to get a particular mobile name based on the ident passed via the request URI.

URIMethodTypeDescription
http://localhost/restexample/mobile/list/GETJSONTo get the list of mobile names in an JSON array.
http://localhost/restexample/mobile/list//GETJSONTo get single mobile data array by ident passed via URL.

The following URIs are mapped to the real file via the .htaccess file.

URI to get the list of all mobiles:

URI to get a particular mobile’s detail using its id:

In the below URI the number ‘2’ is the id of a mobile. The resource domain class can get the particular data with the reference of this id parameter.

Below code snippet shows the complete rules and URL mappings created for this PHP RESTful web service example in its .htaccess file.

RESTful web service controller

In the .htaccess file, we are forwarding all the request to the RestController.php file.

While forwarding the request the parameters are sent to execute a required part of the REST controller. This parameter is the key named as ‘view’.

The value of the key parameter can be either “all” or “single” based on the request URI.

Following is the RestController.php file that receives the request and gets the view parameter. Based on this parameter value, the appropriate controll case will be executed.

On the controller cases, the request is dispatched to respective methods created in the REST handler class.

A simple RESTful base class

Following class has a couple of methods that can be commonly used for the RESTful service handlers.

The getHttpStatusMessage() method is used to get the HTTP status message to construct the response. It contains the HTTP status code and message mapping array.

By receiving the status code, it returns the appropriate header response message. If the invalid status code is passed to this function or no such code is found in the mapping array, then the “Invalid Server Error” will be returned in the response.

These methods can be commonly used in the base class of simple PHP RESTful web services.

RESTful web service handler

This is the service class of this PHP example that handles the REST request dispatched from the controller.

First, we have to decide about the response format in which the resource data has to be prepared. It is based on the request header parameters.

In the request header, the “Accept” parameter will have the specification about the response content format or type.

The protocol here is, when the request is sent, it should set the Request header parameter “Accept” and send it. The values can be like “application/json” or “application/xml” or “text/html”.

Based on these values the response data will be ready by invoking appropriate methods encodeJson(), encodeXML(), encodeHTML() shown below.

Then, the status code has to be returned to the client with the response data. On success, the status code will be 200.

Similarly, there are different status codes available and they should be used accordingly to set response header as we discussed in the above section.

RESTful web service client

There are various stand-alone REST clients available in the market. These client interfaces are used to test a RESTful web service.

The Advanced Rest Client extension which can be added to the Chrome installed in your machine.

We can also write our own custom client to test a RESTful web service.

I used this Google Chrome extension REST client for testing this PHP RESTful web service example.

PHP RESTful web service output

In the below screenshot, it shows how to call RESTful web service. In this screenshot, the circled sections highlight the request URI, selected request method, Header’s Accept param, and more details.

By clicking the send button, the response will be returned from the PHP RESTful web service.

XML Response

I set the application/xml as the response type. So the resultant resource data is prepared in the requested format as shown in the response section of the below screenshot.

PHP RESTful web service JSON response

Conclusion

In this three part tutorial series on RESTful webservices using PHP, you will learn the RESTful implementation in detail using these comprehensive material. This first part has given you a complete introduction to the concepts with step by step example.

With the knowledge that you have acquired from this tutorial, about the rules and principles of RESTfulness, you can build a RESTful API easily. Though there are frameworks for developing RESTful API, it can be done by using plain core PHP which will be effective and provide good performance.

In the coming part, you will be seeing about all aspects of developing a CRUD RESTful web services API using PHP for an entity.

Restful Web Services in PHP Example – PHP + MySQL with Source Code

Hi Guys, Today I’m going to create very simple Login & Signup Restful Webservices using PHP, without using any Framework or Library.

Using PHP Core, there are many straightforward ways to directly write Webservices in a single File or each Webservice in a single File but keep in mind that code organization is one of the most important programming practice. That is the reason that developers prefer using Frameworks because frameworks provide a pre-organized project structure, but for small Applications or writing Restful Webservices, I always prefer Core PHP.

What we’ll cover in Restful Web Services in PHP Example

  1. File Structure
  2. Creating Database & users Table
  3. Database Connectivity
  4. Creating User Class with Signup & Login methods
  5. Creating SignUp & Login RestfulWebservices

File Structure

We’ll use this folders & files structure for writing our Webservices.

api
├─── config/
├────── database.php – file used for connecting to the database.
├─── objects/
├────── user.php – contains properties and methods for “user” database queries.
├─── User/
├────── signup.php – file that will accept user data to be saved to the DB.
├────── login.php – file that will accept username & password and validate

Creating Database & Users Table

Using PHPMyAdmin First create a database I’m using PHPLearning as the database name. For keeping things simple we’ll create very simple users Table with very few columns.

Run this SQL Query to create a users table

Database Connectivity

In your “api” folder, create a new folder “config” and create a new file there as “database.php” and paste this code there

Creating User Class with Signup & Login methods

In your “api” folder, create a new folder “objects” and create a new file there as “user.php” and paste this code there

as you can see we have empty functions for Signup & Login.

Here is the signup Function Code

you can see that signup function is calling isAlreadyExist function for validating if the username already exists. and here’s the code for it

and this is the login Function Code

after adding functions code into “user.php” file, here is the complete code for “user.php” file

Creating SignUp & Login Webservices

In your “api” folder, create a new folder “User” and create a new file there as “signup.php” and paste this code there

as you can see in the code above we are just calling the signup function from the “users.php” in the objects folder.

Following the same, create another file in the User folder, name the file as “login.php” and add the code below in the file

almost done, now you keep this “api” folder in localhost server. I’m using XAMPP so I’m going to paste the “api” folder in the htdocs folder of XAMPP.

Remember that Signup API accepting POST parameters and Login API accepting GET.

Now you can test your Signup API using this URL => http://localhost/api/users/signup.php with Post parameters of username, & password

You can also download complete code from Github.

Note: For keeping things simple for Beginners I’m storing the plain password in Database which is not a good practice. Password must be hashed using PHP hashing methods.

You might be Interested in:

Here are some more Tutorials for creating Web Application & CRUD Operations using PHP & MySQL.

Recommended Training – Treehouse

From beginner to advanced, our recommended coding training is Treehouse.

Treehouse is an online training service that teaches web design, web development and app development with videos, quizzes and interactive coding exercises.

Treehouse’s mission is to bring technology education to those who can’t get it, and is committed to helping its students find jobs. If you’re looking to turn coding into your career, you should consider Treehouse.

Disclosure of Material Connection: Some of the links in the post above are “affiliate links.” This means if you click on the link and purchase the item, we will receive an affiliate commission. Regardless, we only recommend products or services we use personally and believe will add value to our readers.

Ссылка на основную публикацию
Adblock
detector