Собственный XML / JSON / HTML API с PHP
Сегодня у меня есть новая статья PHP для вас. Я расскажу вам о разработке
собственной службы API для ваших проектов. Как пример - давайте
представим, что у нас есть видео-сайт, к которому мы собираемся написать API интерфейс. Мы
научим наш API для работы с POST / GET запросами, и выдачу результата в любом
из следующих форматов: XML / JSON / HTML.
СМОТРЕТЬ ДЕМО СКАЧАТЬ ИСХОДНИК
Шаг 1. SQL
Позволяет добавлять новые таблицы для базы данных вести учет
о тесте видео:
01 CREATE TABLE IF NOT EXISTS
`s189_videos` (
02
`id` int(10) unsigned NOT NULL auto_increment,
03
`title` varchar(255) default '',
04
`author` varchar(255) default '',
05
`thumb` varchar(255) default '',
06
`views` int(10) NOT NULL,
07
PRIMARY KEY (`id`)
08 ) ENGINE=MyISAM DEFAULT
CHARSET=utf8;
09
10 INSERT INTO `s189_videos` (`title`,
`author`, `thumb`, `views`) VALUES
11 ('SURPRISE? - Ray William Johnson
Video', 'RayWilliamJohnson','http://i1.ytimg.com/vi/4EwSAzHj8VM/default.jpg',
10000),
12 ('Sophia Grace and Rosie Hit ...',
'TheEllenShow','http://i4.ytimg.com/vi/KUWpd91UBrA/default.jpg', 20000),
13 ('The Thanksgiving Massacre!',
'FPSRussia', 'http://i2.ytimg.com/vi/Mgd0Hsgl8gU/default.jpg', 30000),
14 ('WE''RE MARRIED!!!!!!', 'CTFxC',
'http://i2.ytimg.com/vi/q1tsmlKXqK8/default.jpg', 40000),
15 ('Guinea Pig Boat IN OUR MAIL?!',
'IanH', 'http://i4.ytimg.com/vi/3t1YysIt598/default.jpg', 50000),
16 ('SCARED PUPPY!!!', 'Tobuscus',
'http://i1.ytimg.com/vi/8RcYkGr_IIw/default.jpg', 60000),
17 ('Review: Jawbone Up',
'SoldierKnowsBest', 'http://i4.ytimg.com/vi/WraMbywRR9M/default.jpg', 70000);
|
Это случайные записи из YouTube.
Шаг 2. PHP
Теперь, давайте представим обзор нашей тестовой страницы:
index.php
01 <?php
02
03 // Test - using POST for add video
record
04 if (isset($_GET['action']) &&
$_GET['action'] == 'curl') {
05
06
$sUrl = "http://your_host_url/service.php";
07
$sData = 'title=TestVideo&action=add_video&type=xml';
08
09
$ch = curl_init();
10
curl_setopt($ch, CURLOPT_URL, $sUrl);
11
curl_setopt($ch, CURLOPT_POSTFIELDS, $sData);
12
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
13
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
14
$vRes = curl_exec($ch);
15
curl_close($ch);
16
17
header('Content-Type: text/xml');
18
echo $vRes;
19
exit;
20 }
21
22 ?>
23 <!DOCTYPE html>
24 <html lang="en" >
25
<head>
26 <meta charset="utf-8"
/>
27 <title>Own XML/JSON/HTML API with
PHP | Script Tutorials</title>
28
29 <link href="css/main.css"
rel="stylesheet" type="text/css" />
30
</head>
31
<body>
32 <header>
33 <h2>Own XML/JSON/HTML API
with PHP</h2>
34 <a
href="http://www.script-tutorials.com/own-xmljsonhtml-api-with-php/"class="stuts">Back
to original tutorial on <span>Script Tutorials</span></a>
35 </header>
36 <div class="container">
37
38 <div class="contr">
39 <form
action="service.php" target="results">
40 <label>Action:
</label>
41 <select
name="action">
42 <option
value="last_videos">Last videos</option>
43 <option
value="top_videos">Top videos</option>
44 </select>
45 <label>Limit:
</label>
46 <select
name="limit">
47 <option
value="1">1</option>
48 <option
value="2">2</option>
49 <option
value="3">3</option>
50 <option
value="4" selected>4</option>
51
<option
value="5">5</option>
52 <option
value="6">6</option>
53 <option
value="7">7</option>
54 </select>
55 <label>Method:
</label>
56 <select name="type">
57 <option
value="xml">XML</option>
58 <option
value="json">JSON</option>
59 <option
value="html">HTML</option>
60 </select>
61 <input type="submit"
/>
62 </form>
63 <a
href="index.php?action=curl">Add video (CURL)</a>
64 </div>
65
66 <div>Results:</div>
67 <iframe name="results"
style="width:600px;height:400px">
68 </iframe>
69 </div>
70 </body>
71 </html>
Как вы можете видеть - большая часть кода находится в HTML
коде. Следующий файл - файл нашего сервиса (услуги индексного файла)
service.php 01 <?php
02
03 require_once('classes/CMySQL.php');
// including service class to work with database
04 require_once('classes/CServices.php');
// including service class to work with database
05 $oServices = new CServices();
06
07 // set method
08 $oServices->setMethod($_REQUEST['type']);
09
10 // set possible limit
11 if (isset($_GET['limit']) &&
(int)$_GET['limit']) {
12
$oServices->setLimit((int)$_GET['limit']);
13 }
14
15 // process actions
16 switch ($_REQUEST['action']) {
17
case 'last_videos':
18 $oServices->getLastVideos();
19 break;
20
case 'top_videos':
21 $oServices->setOrder('top');
22 $oServices->getLastVideos();
23 break;
24
case 'add_video':
25
$oServices->addVideo($_POST['title']);
26 break;
27 }
Довольно простой файл. Он делает обработку всех
запросов с использованием класса CServices (основной класс услуг). Теперь
мы разовьём этот класс, который будет предоставлять все вспомогательные функции,
которые нам нужны.
Классы / CServices.php
001 <?php
002
003 class CServices {
004
005
private $sMethod;
006
private $iLimit;
007
private $sOrder;
008
009
// constructor
010
public function CServices() {
011 $this->sMethod = 'xml';
012 $this->iLimit = 5;
013 $this->sOrder = 'last';
014
}
015
016
// set method
017
public function setMethod($s) {
018 $this->sMethod = $s;
019
}
020
021
// set limit
022
public function setLimit($i) {
023 $this->iLimit = ($i > 0
&& $i < 10) ? $i : $this->iLimit;
024
}
025
026
// set order
027
public function setOrder($s) {
028 $this->sOrder = $s;
029
}
030
031
// return list of videos
032
public function getLastVideos() {
033 // define order field
034 $sOrderField = ($this->sOrder ==
'last') ? 'title' : 'views';
035
036 // obtain data from database
037 $aData =
$GLOBALS['MySQL']->getAll("SELECT * FROM `s189_videos` ORDER BY
`{$sOrderField}` DESC LIMIT {$this->iLimit}");
038
039 // output in necessary format
040 switch ($this->sMethod) {
041 case 'json': // gen JSON result
042 // you can uncomment it for
Live version
043 // header('Content-Type:
text/xml; charset=utf-8');
044 if (count($aData)) {
045 echo
json_encode(array('data' => $aData));
046 } else {
047 echo
json_encode(array('data' => 'Nothing found'));
048 }
049 break;
050 case 'xml': // gen XML result
051 $sCode = '';
052 if (count($aData)) {
053 foreach ($aData as $i
=> $aRecords) {
054 $sCode .=
<<<EOF
055 <unit>
056
<id>{$aRecords['id']}</id>
057
<title>{$aRecords['title']}</title>
058
<author>{$aRecords['author']}</author>
059
<image>{$aRecords['thumb']}</image>
060
<views>{$aRecords['views']}</views>
061 </unit>
062 EOF;
063 }
064 }
065
066 header('Content-Type:
text/xml; charset=utf-8');
067 echo <<<EOF
068 <?xml version="1.0"
encoding="utf-8"?>
069 <videos>
070 {$sCode}
071 </videos>
072 EOF;
073 break;
074 case 'html': // gen HTML result
075 $sCode = '';
076 if (count($aData)) {
077 foreach ($aData as $i
=> $aRecords) {
078 $sCode .=
<<<EOF
079 <div>
080
<img src="{$aRecords['thumb']}"
style="float:left;margin-right:10px;" />
081
<p>Title: {$aRecords['title']}</p>
082
<p>Author: {$aRecords['author']}</p>
083
<p>Views: {$aRecords['views']}</p>
084 </div>
085 EOF;
086 }
087 } else {
088 $sCode =
'<div>Nothing found</div>';
089 }
090
091 header('Content-Type:
text/html; charset=utf-8');
092 echo $sCode;
093 break;
094 }
095
}
096
097
public function addVideo($sTitle) {
098 // just simulation
099 $aData = array('res' => 'Video
"' . $sTitle . '" added successfully');
100
101 switch ($this->sMethod) {
102 case 'json':
103 header('Content-Type:
text/xml; charset=utf-8');
104 echo json_encode($aData);
105 break;
106 case 'xml':
107 header('Content-Type:
text/xml; charset=utf-8');
108 echo <<<EOF
109 <?xml version="1.0"
encoding="utf-8"?>
110 <res>
111 {$aData['res']}
112 </res>
113 EOF;
114 break;
115 case 'html':
116 header('Content-Type:
text/html; charset=utf-8');
117 echo '<div>' .
$aData['res'] . '</div>';
118 break;
119 }
120 }
121 }
|
В этом классе я добавил все сервисные функции. Одна из
функций - 'getLastVideos "сделана для получения списков видео. Вторая
"addVideo '- для добавления новых видео. Конечно - я не добавлял
видео на самом деле - просто моделировал процесс. В результате функция - Я
генерировал результат в требуемом формате.
Классы / CMySQL.php
Это обычный класс сервис для работы с базой
данных. Доступные в исходнике.
СМОТРЕТЬ ДЕМО СКАЧАТЬ ИСХОДНИК
Источник
урока
|