Работа с реальным API на PHP
| Введение | |
| Реальный пример работы с API | |
| Похожие статьи |
Введение
В этой статье вы можете изучить пример выполнения и обработки запроса к реальному API
с помощью средств PHP.
Для лучшего понимания полезно владеть материалом статьи
json_decode
Реальный пример
Сайту
HeiHei.ru
нужно получить информацию о пробках на границе с Финляндией.
Для этого он обращается к
API
сайта narganitse.ru. Который просто возвращает файл data.json.
Сайт больше не доступен, поэтому получить оттуда json уже не получится.
Я всё ещё пытаюсь обращаться к нему, но не получаю ответ и использую сохранившийся
у меня data.json со следующими данными (комментарии // добавлены для сайта, их нужно удалить):
[ { // Из России "1": { // Торфяновка "number": "12", // Число машин "date": 1325513571, // UNIX-время, когда было получено сообщение "comment": "", // Комментарий "changes": -11, // Изменение относительно предыдущего сообщения "author": "test", // Имя автора комментария "url": "", "waiting": 15 // Примерное время ожидания }, "2": { // Брусничное "number": "0", "date": 1303291117, "comment": "", "changes": -55, "author": "***0606", "url": "", "waiting": 0 }, "3": { // Светогорск "number": "35", "date": 1303287127, "comment": "машин не много: 30-35. только подъехали и пока стоим.", "changes": -20, "author": "Explorer002", "url": "", "waiting": 42 } }, { // В Россию "1": { "number": "13", "date": "1326638542", "comment": "", "changes": -32, "author": "***2117", "url": "", "waiting": 16 }, "2": { "number": "60", "date": 1303294658, "comment": "", "changes": 40, "author": "granitsa-online.com", "url": "http://granitsa-online.com", "waiting": 72 }, "3": { "number": "0", "date": 1303279308, "comment": "", "changes": -12, "author": "Logan", "url": "", "waiting": 0 } } ]
Первым делом проверим наличие файла функцией get_headers().
Она возвращает массив, нулевым элементом которого является HTTP статус.
В случае успеха это HTTP/1.1 200 OK
В данный момент это HTTP/1.1 502 Bad Gateway
С помощью функции substr() вырежем только первые две цифры из HTTP статуса. Если результат не 20 - будем читать сохранённый файл.
<?php $url = "http://api.nagranitse.ru/data.json"; $headers = get_headers($url); $status = substr($headers[0], 9, 2); if ($status == 20) { $json_border = file_get_contents($url); } else { $myfile = fopen("data.json", "r") or die("Unable to open file!"); $json_border = fread($myfile, filesize("data.json")); # echo $json_border; fclose($myfile); }; $border_obj = json_decode($json_border, true);
Посмотрим, как выглядит необработанный JSON, который мы получили от API. Если API сломалось и ничего не возвращает - то увидим тот же файл, который уже был показан выше.
echo $json_border;
[ { "1": { "number": "12", "date": 1325513571, "comment": "", "changes": -11, "author": "test", "url": "", "waiting": 15 }, "2": { "number": "0", "date": 1303291117, "comment": "", "changes": -55, "author": "***0606", "url": "", "waiting": 0 }, "3": { "number": "35", "date": 1303287127, "comment": "машин не много: 30-35. только подъехали и пока стоим.", "changes": -20, "author": "Explorer002", "url": "", "waiting": 42 } }, { "1": { "number": "13", "date": "1326638542", "comment": "", "changes": -32, "author": "***2117", "url": "", "waiting": 16 }, "2": { "number": "60", "date": 1303294658, "comment": "", "changes": 40, "author": "granitsa-online.com", "url": "http://granitsa-online.com", "waiting": 72 }, "3": { "number": "0", "date": 1303279308, "comment": "", "changes": -12, "author": "Logan", "url": "", "waiting": 0 } } ]
Теперь применим json_decode
$border_obj = json_decode($json_border,true);
С помощью функции gettype() убедимся, что это массив.
echo(gettype($border_obj));
array
И посмотрим содержимое. С помощью
var_dump($border_obj);
Массив содержит два вложенных массива - это мы видим из array(2) в самом начале.
Первый найти легко: [0]=> array(6)
Второй начинается в середине: [1]=> array(6)
array(2) { [0]=> array(3) { [1]=> array(7) { ["number"]=> string(2) "12" ["date"]=> int(1325513571) ["comment"]=> string(0) "" ["changes"]=> int(-11) ["author"]=> string(4) "test" ["url"]=> string(0) "" ["waiting"]=> int(15) } [2]=> array(7) { ["number"]=> string(1) "0" ["date"]=> int(1303291117) ["comment"]=> string(0) "" ["changes"]=> int(-55) ["author"]=> string(7) "***0606" ["url"]=> string(0) "" ["waiting"]=> int(0) } [3]=> array(7) { ["number"]=> string(2) "35" ["date"]=> int(1303287127) ["comment"]=> string(90) "машин не много: 30-35. только подъехали и пока стоим." ["changes"]=> int(-20) ["author"]=> string(11) "Explorer002" ["url"]=> string(0) "" ["waiting"]=> int(42) } } [1]=> array(3) { [1]=> array(7) { ["number"]=> string(2) "13" ["date"]=> string(10) "1326638542" ["comment"]=> string(0) "" ["changes"]=> int(-32) ["author"]=> string(7) "***2117" ["url"]=> string(0) "" ["waiting"]=> int(16) } [2]=> array(7) { ["number"]=> string(2) "60" ["date"]=> int(1303294658) ["comment"]=> string(0) "" ["changes"]=> int(40) ["author"]=> string(19) "granitsa-online.com" ["url"]=> string(26) "http://granitsa-online.com" ["waiting"]=> int(72) } [3]=> array(7) { ["number"]=> string(1) "0" ["date"]=> int(1303279308) ["comment"]=> string(0) "" ["changes"]=> int(-12) ["author"]=> string(5) "Logan" ["url"]=> string(0) "" ["waiting"]=> int(0) } } }
Достанем количество машин, дату, комментарий, изменение количества, автора, и время ожидания
присланые пользователем на выезде из России через Торфяновку.
Так как waiting является необязательным полем, которое многие не заполняют - сделаем проверку
перед выводом.
echo $border_obj[0][1]["number"];
echo $border_obj[0][1]["date"];
echo $border_obj[0][1]["comment"];
echo $border_obj[0][1]["changes"];
echo $border_obj[0][1]["author"];
if (isset($border_obj[1][6]["waiting"])) {
echo $border_obj[1][6]["waiting"];
};
12
1325513571
-11
test
15
Комментарий пуст.
Дата дана в формате epoch time. Подробнее можете прочитать в моей статье
Epoch Time
Теперь повторим, но для Светогорска и на въезд в Россиию.
echo $border_obj[1][3]["number"];
echo $border_obj[1][3]["date"];
echo $border_obj[1][3]["comment"];
echo $border_obj[1][3]["changes"];
echo $border_obj[1][3]["author"];
if (isset($border_obj[1][6]["waiting"])) {
echo $border_obj[1][6]["waiting"];
};
0
1303279308
-12
Logan
0
Для лучшей читаемости, сконвертируем время из
Epoch Time
в обычную дату.
И пройдёмся циклом по всем сообщениям о въезде в Россию
Число машин: 13
Дата: 2012-01-15 18:42:22
Комментарий:
Изменения: -32
Автор: ***2117
Время ождидания: 16
Число машин: 60
Дата: 2011-04-20 14:17:38
Комментарий:
Изменения: 40
Автор: granitsa-online.com
Время ождидания: 72
Число машин: 0
Дата: 2011-04-20 10:01:48
Комментарий:
Изменения: -12
Автор: Logan
Время ождидания: 0
Автор статьи: Андрей Олегович