Статьи

Создайте свой собственный API XML / JSON / HTML с PHP

Сегодня у меня есть новая статья PHP для вас. Я расскажу вам о разработке собственного API-сервиса для ваших проектов. В качестве примера — давайте представим, что у нас есть видео-сайт, для которого мы собираемся написать интерфейс API. Мы учим наш API работать с запросами POST / GET и возвращаем результат в любом из следующих форматов: XML / JSON / HTML. Кроме того, в качестве дополнительной подвыборки, будет показано, как отправлять запросы CURL (например, для добавления записей) в наш сервис.

Живая Демо Скачать в упаковке

 


Сейчас — скачайте исходные файлы и начнем писать код!


Шаг 1. SQL

Давайте добавим новую таблицу для нашей базы данных, чтобы вести записи о тестовых видео:

CREATE TABLE IF NOT EXISTS `s189_videos` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `title` varchar(255) default '',
  `author` varchar(255) default '',
  `thumb` varchar(255) default '',
  `views` int(10) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

INSERT INTO `s189_videos` (`title`, `author`, `thumb`, `views`) VALUES
('SURPRISE? - Ray William Johnson Video', 'RayWilliamJohnson', 'http://i1.ytimg.com/vi/4EwSAzHj8VM/default.jpg', 10000),
('Sophia Grace and Rosie Hit ...', 'TheEllenShow', 'http://i4.ytimg.com/vi/KUWpd91UBrA/default.jpg', 20000),
('The Thanksgiving Massacre!', 'FPSRussia', 'http://i2.ytimg.com/vi/Mgd0Hsgl8gU/default.jpg', 30000),
('WE''RE MARRIED!!!!!!', 'CTFxC', 'http://i2.ytimg.com/vi/q1tsmlKXqK8/default.jpg', 40000),
('Guinea Pig Boat IN OUR MAIL?!', 'IanH', 'http://i4.ytimg.com/vi/3t1YysIt598/default.jpg', 50000),
('SCARED PUPPY!!!', 'Tobuscus', 'http://i1.ytimg.com/vi/8RcYkGr_IIw/default.jpg', 60000),
('Review: Jawbone Up', 'SoldierKnowsBest', 'http://i4.ytimg.com/vi/WraMbywRR9M/default.jpg', 70000);

Это просто случайные записи с YouTube.

Шаг 2. PHP

Теперь давайте рассмотрим нашу тестовую страницу:

index.php

<?php

// Test - using POST for add video record
if (isset($_GET['action']) && $_GET['action'] == 'curl') {

    $sUrl = "http://your_host_url/service.php";
    $sData = 'title=TestVideo&action=add_video&type=xml';

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $sUrl);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $sData);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    $vRes = curl_exec($ch);
    curl_close($ch);

    header('Content-Type: text/xml');
    echo $vRes;
    exit;
}

?>
<!DOCTYPE html>
<html lang="en" >
    <head>
        <meta charset="utf-8" />
        <title>Own XML/JSON/HTML API with PHP | Script Tutorials</title>

        <link href="css/main.css" rel="stylesheet" type="text/css" />
    </head>
    <body>
        <header>
            <h2>Own XML/JSON/HTML API with PHP</h2>
            <a href="http://www.script-tutorials.com/own-xmljsonhtml-api-with-php/" class="stuts">Back to original tutorial on <span>Script Tutorials</span></a>
        </header>
        <div class="container">

            <div class="contr">
                <form action="service.php" target="results">
                    <label>Action: </label>
                    <select name="action">
                        <option value="last_videos">Last videos</option>
                        <option value="top_videos">Top videos</option>
                    </select>
                    <label>Limit: </label>
                    <select name="limit">
                        <option value="1">1</option>
                        <option value="2">2</option>
                        <option value="3">3</option>
                        <option value="4" selected>4</option>
                        <option value="5">5</option>
                        <option value="6">6</option>
                        <option value="7">7</option>
                    </select>
                    <label>Method: </label>
                    <select name="type">
                        <option value="xml">XML</option>
                        <option value="json">JSON</option>
                        <option value="html">HTML</option>
                    </select>
                    <input type="submit" />
                </form>
                <a href="index.php?action=curl">Add video (CURL)</a>
            </div>

            <div>Results:</div>
            <iframe name="results" style="width:600px;height:400px">
            </iframe>
        </div>
    </body>
</html>

Как видите, большая часть кода — это просто HTML-код. Но в начале — наш образец для отправки запроса CURL. Следующий файл — наш сервисный файл (файл индекса сервиса).

service.php

<?php

require_once('classes/CMySQL.php'); // including service class to work with database
require_once('classes/CServices.php'); // including service class to work with database
$oServices = new CServices();

// set method
$oServices->setMethod($_REQUEST['type']);

// set possible limit
if (isset($_GET['limit']) && (int)$_GET['limit']) {
    $oServices->setLimit((int)$_GET['limit']);
}

// process actions
switch ($_REQUEST['action']) {
    case 'last_videos':
        $oServices->getLastVideos();
        break;
    case 'top_videos':
        $oServices->setOrder('top');
        $oServices->getLastVideos();
        break;
    case 'add_video':
        $oServices->addVideo($_POST['title']);
        break;
}

Довольно легкий файл. Обрабатывает все запросы с использованием класса «CServices» (основной класс обслуживания). Теперь мы собираемся разработать этот класс, который будет предоставлять все необходимые нам функции полезности.

классы / CServices.php

<?php

class CServices {

    private $sMethod;
    private $iLimit;
    private $sOrder;

    // constructor
    public function CServices() {
        $this->sMethod = 'xml';
        $this->iLimit = 5;
        $this->sOrder = 'last';
    }

    // set method
    public function setMethod($s) {
        $this->sMethod = $s;
    }

    // set limit
    public function setLimit($i) {
        $this->iLimit = ($i > 0 && $i < 10) ? $i : $this->iLimit;
    }

    // set order
    public function setOrder($s) {
        $this->sOrder = $s;
    }

    // return list of videos
    public function getLastVideos() {
        // define order field
        $sOrderField = ($this->sOrder == 'last') ? 'title' : 'views';

        // obtain data from database
        $aData = $GLOBALS['MySQL']->getAll("SELECT * FROM `s189_videos` ORDER BY `{$sOrderField}` DESC LIMIT {$this->iLimit}");

        // output in necessary format
        switch ($this->sMethod) {
            case 'json': // gen JSON result
                // you can uncomment it for Live version
                // header('Content-Type: text/xml; charset=utf-8');
                if (count($aData)) {
                    echo json_encode(array('data' => $aData));
                } else {
                    echo json_encode(array('data' => 'Nothing found'));
                }
                break;
            case 'xml': // gen XML result
                $sCode = '';
                if (count($aData)) {
                    foreach ($aData as $i => $aRecords) {
                        $sCode .= <<<EOF
<unit>
    <id>{$aRecords['id']}</id>
    <title>{$aRecords['title']}</title>
    <author>{$aRecords['author']}</author>
    <image>{$aRecords['thumb']}</image>
    <views>{$aRecords['views']}</views>
</unit>
EOF;
                    }
                }

                header('Content-Type: text/xml; charset=utf-8');
                echo <<<EOF
<?xml version="1.0" encoding="utf-8"?>
<videos>
{$sCode}
</videos>
EOF;
                break;
            case 'html': // gen HTML result
                $sCode = '';
                if (count($aData)) {
                    foreach ($aData as $i => $aRecords) {
                        $sCode .= <<<EOF
<div>
    <img src="{$aRecords['thumb']}" style="float:left;margin-right:10px;" />
    <p>Title: {$aRecords['title']}</p>
    <p>Author: {$aRecords['author']}</p>
    <p>Views: {$aRecords['views']}</p>
</div>
EOF;
                    }
                } else {
                    $sCode = '<div>Nothing found</div>';
                }

                header('Content-Type: text/html; charset=utf-8');
                echo $sCode;
                break;
        }
    }

    public function addVideo($sTitle) {
        // just simulation
        $aData = array('res' => 'Video "' . $sTitle . '" added successfully');

        switch ($this->sMethod) {
            case 'json':
                header('Content-Type: text/xml; charset=utf-8');
                echo json_encode($aData);
                break;
            case 'xml':
                header('Content-Type: text/xml; charset=utf-8');
                echo <<<EOF
<?xml version="1.0" encoding="utf-8"?>
<res>
{$aData['res']}
</res>
EOF;
                break;
            case 'html':
                header('Content-Type: text/html; charset=utf-8');
                echo '<div>' . $aData['res'] . '</div>';
                break;
        }
    }
}

В этом классе я добавил все сервисные функции. Одна из функций — getLastVideos предназначена для получения списков видео. Второй «addVideo» — для добавления новых видео. Конечно — я не добавил видео на самом деле — просто смоделируйте процесс. В результате функции — я генерирую результат в запрошенном формате.

 

классы / CMySQL.php

 

Это наш обычный сервисный класс для работы с базой данных. Доступно в упаковке.


Live Demo

 

скачать в архиве

 


Вывод

Довольно классная штука, не правда ли? С небольшим количеством кода и некоторой умной логикой вы можете добавить полнофункциональный API к своим проектам. Если у вас есть какие-либо хорошие идеи, которыми вы хотели бы поделиться, обязательно оставьте их в комментариях. Удачи!

 

Источник: http://www.script-tutorials.com/own-xmljsonhtml-api-with-php/