HTTP API

Урок 21

Зарегистрируйтесь или войдите и получите бесплатный доступ к первым 3-м урокам курса.

Урок 21

HTTP API

В этом уроке мы с вами поговорим об HTTP API в WordPress. Как обычно, не хочу слишком напрягать вас теорией (для этого есть википедия), поэтому всё будем рассматривать на практических примерах.

HTTP API — это набор функций в WordPress, который позволяет взаимодействовать со сторонними сайтами. Например, таким образом вы можете получить актуальные курсы валют, погоду на сегодня или даже создать пост в Инстаграм!

Чтобы скачать тему WordPress, которая получилась у нас в процессе этого урока, необходимо приобрести курс.

Пошаговый принцип работы HTTP API

Если рассмотреть этот процесс по шагам, то:

  1. Первым делом мы отправляем запрос (HTTP-запрос) на сторонний ресурс (URL), например при помощи функции wp_remote_get().
  2. Когда запрос отправлен, сторонний ресурс его обработает. Тут тоже ничего сложного, представьте, что открываете какой-то сайт, или производите поиск в гугле – точно такой же механиз, только мы используем для отправки запросов браузер, а не HTTP API ВордПресса.
  3. Получаем результат в переменную, которую возвращает функция wp_remote_get(). И уже в зависимости от содержания этой переменной, мы знаем, что вернул нам сторонний ресурс, и вернул ли он вообще что-либо, либо послал нас.

Пример использования HTTP API

Для того, чтобы вам всё было максимально понятно, расскажу супер-подробно и по шагам.

Прежде всего нужно решить, к какому сайту будем подключаться и какие данные вытаскивать. Я бы рекомендовал использовать 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 для получения каких-то данных плюс для их отображения на сайте (те же курсы валют или погода), то вам необходимо использовать транзитный кэш! На это существует две причины:

  1. Если вы будете получать какие-либо данные со сторонних API при каждой загрузке страниц вашего сайта, то вы однозначно это ощутите на скорости загрузки.
  2. Большинство API имеют лимиты, и когда вы их превысите, вам нужно будет либо купить более дорогой тарифный план, либо вообще ничего работать не будет.

Поэтому не лучше ли закэшировать полученные из API значения курсов валют на несколько часов или даже на день, ведь они же всё равно обновляются раз в сутки?

Подробный видеоурок по транзитному кэшу доступен по ссылке.

GET, POST и другие запросы

При отправке запросов при помощи HTTP API мы так или иначе можем столкнуться с несколькими типами запросов:

  • GET,
  • POST,
  • HEAD,
  • PUT,
  • DELETE,
  • TRACE,
  • CONNECT.

Для отправки каждого из них можно воспользоваться следующими функциями:

Самое основное, что тут нужно знать для начала, это то, что GET-запросы мы используем для получения данных – например тех же курсов валют, POST-запросы – для отправки каких-то данных на сторонний сервер, например публикуем пост в инстаграм. Остальные типы запросов можете использовать, когда это рекомендуется непосредственно в документации API.

Коды ответа

В примере выше мы проверяли код ответа от сервера функцией wp_remote_retrieve_response_code(). В таблице перечислены наиболее часто встречающиеся из них:

Код ответа (Status code)Описание
200OK
301Редирект (перемещена навегда)
302Редирект (перемещена временно)
403Доступ запрещён
404Страницы не существует
500Ошибка на сервере
503Сервер недоступен

Авторизация запроса

Это супер-редкость – когда для взаимодействия с API вам достаточно указать лишь URL, как мы делали в примере выше.

Чаще – вам нужно либо передать ключ API, который вам выдают при регистрации в личном кабинете (этот пример рассмотрим в видео), либо и вовсе – логин и пароль, если это что-то вроде платёжного шлюза.

Передача ключа 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 );
Купить курс
  • 21 видеоурок
  • Можно скачать готовый код после каждого урока
  • Уроки актуальны под последние версии WordPress
  • Можно начать проходить курс сразу же после оплаты
  • Достаточно базовых знаний HTML и CSS, чтобы пройти курс
  • Доступ навсегда
  • Единоразовый платёж
5000 р3500 р
Скидка 30% до 23 мая

Нажав на кнопку, вы соглашаетесь c условиями предоставления услуг и с обработкой персональных данных.