HTTP API
Урок 21
В этом уроке мы с вами поговорим об HTTP API в WordPress. Как обычно, не хочу слишком напрягать вас теорией (для этого есть википедия), поэтому всё будем рассматривать на практических примерах.
HTTP API — это набор функций в WordPress, который позволяет взаимодействовать со сторонними сайтами. Например, таким образом вы можете получить актуальные курсы валют, погоду на сегодня или даже создать пост в Инстаграм!
Чтобы скачать тему WordPress, которая получилась у нас в процессе этого урока, необходимо приобрести курс.
Если рассмотреть этот процесс по шагам, то:
Для того, чтобы вам всё было максимально понятно, расскажу супер-подробно и по шагам.
Прежде всего нужно решить, к какому сайту будем подключаться и какие данные вытаскивать. Я бы рекомендовал использовать API, которые возвращают данные в формате JSON – их нам будет легко обработать. Но иногда бывают и другие форматы ответа, например XML. К примеру сравните эти две ссылки: https://www.cbr-xml-daily.ru/daily_json.js
и https://www.cbr-xml-daily.ru/daily.xml
. Перейдите по урлам. Согласитесь, что первый даже визуальнее выглядит приятнее?
Ну и да, как вы могли догадаться, мы будем получать курс валют. Используем для этого функцию wp_remote_get() (есть и другие функции, в чём отличия – расскажу ниже). В качестве первого параметра передаём URL стороннего ресурса. В некоторых случаях при подключении к API нам ещё нужно авторизоваться, либо передать ключ. Сейчас ничего такого делать не нужно.
$response = wp_remote_get( 'https://www.cbr-xml-daily.ru/daily_json.js' ); // тут можете распечать результат, но там ну оооочень много всего будет // print_r( $response );
Теперь смотрите, когда вы переходите по любой ссылке в браузере, то с чем вы можете столкнуться? Например, если вы опечатались в URL сайта, то он у вас не откроется, верно? Так вот, все эти моменты обрабатываются классом ошибки WP_Error. Наша задача – прочекать это в условии, вот так:
// проверяем, что не ошибка if( is_wp_error( $response ) ) { // если ошибка, то выводим собщение echo $response->get_error_message(); // и можно(нужно) даже дальше не выполнять код exit; } // к примеру, если обратились к несуществующему сайту, то ошибка будет: // "cURL error 6: Couldn't resolve host 'wfdsfsfwwfdsfdkfj.ru'" // если нет необходимости выводить эти ошибки, то достаточно проверки кода ответа в следующем шаге
Следующим шагом я бы порекомендовал вам проверить код ответа всё же.
// код ответа должен быть 200, это означает, что всё классно if( 200 !== wp_remote_retrieve_response_code( $response ) ) { echo 'Что-то пошло не так, мб страницы не существует?'; exit; }
Этот же код можно записать при помощи функции wp_remote_retrieve_response_message(), которая возвращает сообщение на основе кода ответа. Но делать обе проверки я думаю ни к чему.
if( 'OK' !== wp_remote_retrieve_response_message( $response ) ) { echo 'Что-то пошло не так, мб страницы не существует?'; exit; }
Класс – на этот момент мы уже знаем, что запрос прошёл успешно, и сервер вернул какой-то ответ. Тела ответа мы можем получить функцией wp_remote_retrieve_body().
$response = wp_remote_retrieve_body( $response ); // и ещё момент, у нас же ответ от сервера получен в формате JSON, поэтому $response = json_decode( $response ); // можете распечатать для себя, чтобы было понятно, что внутри print_r( $response );
Далее – уже работаем с полученным результатом в виде массива или объекта. Например выводим курс доллара и евро по отношению к рублю:
echo 'Курс Доллара: ' . $response->Valute->USD->Value; echo 'Курс Евро: ' . $response->Valute->EUR->Value;
Ребят, если вы используете HTTP API для получения каких-то данных плюс для их отображения на сайте (те же курсы валют или погода), то вам необходимо использовать транзитный кэш! На это существует две причины:
Поэтому не лучше ли закэшировать полученные из API значения курсов валют на несколько часов или даже на день, ведь они же всё равно обновляются раз в сутки?
Подробный видеоурок по транзитному кэшу доступен по ссылке.
При отправке запросов при помощи HTTP API мы так или иначе можем столкнуться с несколькими типами запросов:
Для отправки каждого из них можно воспользоваться следующими функциями:
Самое основное, что тут нужно знать для начала, это то, что GET-запросы мы используем для получения данных – например тех же курсов валют, POST-запросы – для отправки каких-то данных на сторонний сервер, например публикуем пост в инстаграм. Остальные типы запросов можете использовать, когда это рекомендуется непосредственно в документации API.
В примере выше мы проверяли код ответа от сервера функцией wp_remote_retrieve_response_code(). В таблице перечислены наиболее часто встречающиеся из них:
Код ответа (Status code) | Описание |
---|---|
200 | OK |
301 | Редирект (перемещена навегда) |
302 | Редирект (перемещена временно) |
403 | Доступ запрещён |
404 | Страницы не существует |
500 | Ошибка на сервере |
503 | Сервер недоступен |
Это супер-редкость – когда для взаимодействия с API вам достаточно указать лишь URL, как мы делали в примере выше.
Чаще – вам нужно либо передать ключ API, который вам выдают при регистрации в личном кабинете (этот пример рассмотрим в видео), либо и вовсе – логин и пароль, если это что-то вроде платёжного шлюза.
Тут трудностей возникнуть не должно. Ключ чаще всего мы добавляем дополнительным GET-параметром к урлу, например:
$response = wp_remote_get( add_query_arg( 'api_key', $api_key, 'https://какой-то-сервер' ) );
Или:
$response = wp_remote_get( 'https://какой-то-сервер?api_key=' . $api_key );
Базовая авторизация (Basic Authentication, BasicAuth) – нередко бывает нужна для взаимодействия с API с чуть более серьёзным назначением, например проведение оплаты через платёжный шлюз.
У функций wp_remote_get() и wp_remote_post() нет каких-то очевидных параметров, в которые мы можем передать логин и пароль, это делается немного хитрым способом, но сложного в любом случае ничего нет.
$login = 'ТУТ ЛОГИН'; $pass = 'ТУТ ПАРОЛЬ'; $args = array( 'headers' => array( 'Authorization' => 'Basic ' . base64_encode( $login . ':' . $pass ) ) ); wp_remote_post( $url, $args );
Список уроков