Работа с реальным 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

Автор статьи: Андрей Олегович

Похожие статьи
PHP
Массивы
Циклы, ветвления
Дата и время. Часовые пояса
gettype(): определить тип переменной PHP
json_decode
Как получить ширину экрана с помощью PHP
Узнать свой HTTP_USER_AGENT
Классы в PHP 8
substr: обрезать строку
Запросы к REST API на PHP
$_SERVER['REQUEST_URI']: текущая url
Работа с базами данных
Работа с cookies
PHP sessions
Аутентификация и авторизация в PHP 8
Мои скрипты
Разбор ошибок

Поиск по сайту

Подпишитесь на Telegram канал @aofeed чтобы следить за выходом новых статей и обновлением старых

Перейти на канал

@aofeed

Задать вопрос в Телеграм-группе

@aofeedchat

Контакты и сотрудничество:
Рекомендую наш хостинг beget.ru
Пишите на info@urn.su если Вы:
1. Хотите написать статью для нашего сайта или перевести статью на свой родной язык.
2. Хотите разместить на сайте рекламу, подходящую по тематике.
3. Реклама на моём сайте имеет максимальный уровень цензуры. Если Вы увидели рекламный блок недопустимый для просмотра детьми школьного возраста, вызывающий шок или вводящий в заблуждение - пожалуйста свяжитесь с нами по электронной почте
4. Нашли на сайте ошибку, неточности, баг и т.д. ... .......
5. Статьи можно расшарить в соцсетях, нажав на иконку сети: