В этом руководстве мы узнаем о HTTP-API WordPress и различных функциях, которые он предлагает для выполнения HTTP-запросов и обработки ответов.
Вступление
Есть множество способов сделать HTTP-запросы с PHP. Например, наиболее популярными являются « fopen
» и « curl
»; и разные веб-хосты имеют разные уровни поддержки для них. Когда вы разрабатываете для WordPress, вы должны убедиться, что ваш код работает на максимально возможном количестве хостов. Таким образом, требуется решение, которое поддерживает все различные способы транспортировки.
Начиная с версии 2.7, WordPress реализовал класс « WP_Http
» для решения этой проблемы, предоставляя стандартизированный API для выполнения HTTP-запросов. Этот класс автоматически выбирает и использует транспортный API, поддерживаемый веб-хостом.
«WordPress HTTP API обеспечивает решение для кросс-совместимости. Вы всегда должны использовать его, если это возможно».
Некоторые основы HTTP-запросов
HTTP (сокращение от HyperText Transfer Protocol) — это протокол, используемый веб-браузерами для передачи информации через Интернет. Когда вы загружаете веб-страницу (как эта), вы отправляете запрос на сервер; и тогда вы получите ответ. Существуют различные методы запроса (например, GET, POST, HEAD, PUT), а также множество кодов состояния ответа (например, печально известный 404, когда страница не найдена).
Я не собираюсь углубляться в эту глубокую тему, но это должно дать вам базовое представление о том, что мы собираемся сделать: сделать HTTP-запрос к URL-адресу и получить ответ. Конечно, вы можете сделать это с помощью браузера, но мы узнаем, как это сделать в WordPress. Преимущества или возможности безграничны. Вы можете отправлять запросы на фиды, файлы JSON, данные XML или полные веб-страницы.
Как мы уже упоминали выше, WordPress имеет класс, который упрощает выполнение HTTP-вызовов. Имя класса — « WP_Http
», а соответствующий метод — « $wp_http_instance->request($url)
». Этот метод возвращает результат HTTP-запроса, который мы подробно опишем позже.
1
2
3
4
5
6
|
if( !class_exists( ‘WP_Http’ ) ) {
include_once( ABSPATH . WPINC. ‘/class-http.php’ );
}
$request = new WP_Http;
$args = array ();
$result = $request->request( ‘http://mysite.com’ , $args );
|
Так как этот фрагмент кода немного длинный (и повторяется, если вы делаете много запросов), WordPress предоставляет более простую функцию, которая делает то же самое:
1
2
|
$arg = array ();
wp_remote_request (‘http://mysite.com’, $arg);
|
В массиве arguments вы можете указать один или несколько параметров запроса. Одним из этих параметров является метод запроса. Если вы делаете запрос «GET»:
1
2
|
$arg = array ( ‘method’ => ‘GET’);
wp_remote_request ( ‘http://mysite.com’ , $arg );
|
Это идет еще дальше с 3 дополнительными вспомогательными функциями для методов запроса GET, POST и HEAD, так как они используются чаще всего:
-
wp_remote_get()
— получает URL, используя метод GET HTTP -
wp_remote_post()
—wp_remote_post()
URL, используя метод POST HTTP -
wp_remote_head()
— получает URL, используя метод HEAD HTTP.
Настоятельно рекомендуется использовать вспомогательные функции вместо класса WP_Http
. Вот для чего они созданы.
Выполнение нашего первого HTTP-запроса
Итак, давайте сделаем наш первый HTTP-запрос. Я выбрал Bitcoinica в качестве сервиса, с которого мы будем получать данные. Есть несколько причин для этого. Во-первых, большинство уроков выбирают API Twitter; и, во-вторых, API-интерфейс Bitcoinica является RESTful, простым и хорошо документированным. Вы можете найти полную документацию по API на их веб-сайте .
Если вы не знаете Биткойн, это торговый сервис для биткойнов (виртуальная валюта). Их API предоставляет множество функций: получение последней котировки для валютной пары, размещение ордеров, отслеживание позиций и т. Д.
Первый запрос извлечет последнюю котировку для данной валютной пары. Документация по API довольно важна, поскольку в ней упоминаются URL-адреса для выполнения вызовов и ожидаемый ответ. Чтобы упростить задачу, я вставил код в плагин, а также запретил WordPress загружать тему. Это сделает результаты более чистыми, не загромождая HTML-код темы.
01
02
03
04
05
06
07
08
09
10
11
12
13
|
<?php
/*
Plugin Name: Bitcoinica Ticker
Plugin URI: http://mystore.com
Description: Retrieves Bitcoinica prices
Author: Abid Omar
Version: 1.0
*/
add_filter (‘template_redirect’, function() {
$response = wp_remote_get ( ‘https://www.bitcoinica.com/api/quotes/BTCUSD.json’, array ( ‘sslverify’ => false ) );
var_dump($response);
exit;
});
|
Разбор ответа HTTP
Когда вы загружаете свой блог, вы должны получить что-то похожее на это:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
array(
‘headers’ =>
array(
‘server’ => string ‘nginx/0.7.67’ (length=12)
‘date’ => string ‘Fri, 09 Mar 2012 16:38:30 GMT’ (length=29)
‘content-type’ => string ‘application/json;
‘connection’ => string ‘close’ (length=5)
‘status’ => string ‘200 OK’ (length=6)
‘strict-transport-security’ => string ‘max-age=31536000’ (length=16)
‘x-ua-compatible’ => string ‘IE=Edge,chrome=1’ (length=16)
‘etag’ => string ‘»578a43c47f9d9d5f4159bcd1a6f63f06″‘ (length=34)
‘cache-control’ => string ‘max-age=0, private, must-revalidate’ (length=35)
‘x-request-id’ => string ’07bb51e7df9f0a4a50718fa7af21cc76′ (length=32)
‘x-runtime’ => string ‘0.007439’ (length=8)
‘x-rack-cache’ => string ‘miss’ (length=4)
)
‘body’ => string ‘{«buying»:4.89989,»pair»:»BTCUSD»,»selling»:4.9639}’ (length=51)
‘response’ =>
array(
‘code’ => int 200
‘message’ => string ‘OK’ (length=2)
)
‘cookies’ =>
array(
empty
)
‘filename’ => null
)
|
Это полный ответ HTTP. На самом деле это обычный текст, но WordPress упрощает его в этом массиве. Ниже приведен реальный ответ HTTP
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
|
HTTP/1.1 200 OK
Server: nginx/0.7.67
Date: Fri, 09 Mar 2012 21:32:09 GMT
Content-Type: application/json;
Transfer-Encoding: chunked
Connection: keep-alive
Status: 200 OK
Strict-Transport-Security: max-age=31536000
X-UA-Compatible: IE=Edge,chrome=1
ETag: «93b5e5de369c0a1d83a16aa5a787b60d»
Cache-Control: max-age=0, private, must-revalidate
X-Request-Id: e4332f7b46ef751703d817216b7816d1
X-Runtime: 0.008076
X-Rack-Cache: miss
{
«pair»: «BTCUSD»,
«selling»: 4.96854,
«buying»: 4.86172
}
|
Первая строка (в текстовом HTTP-ответе) — это версия протокола HTTP, а также код состояния ответа. Далее следуют заголовки ответа, набор пар ключ и значение, а затем у вас есть тело ответа. WordPress размещает эту информацию в массиве ответов.
Обработка ошибок
Но что, если что-то пойдет не так, и мы не сможем подключиться к серверу? Это может произойти по разным причинам, например, из-за сбоя сервера, слишком много времени для ответа или сбоя проверки сертификата SSL. В этом случае WordPress возвращает объект WP_error
который объясняет ошибку.
01
02
03
04
05
06
07
08
09
10
11
12
13
|
object(WP_Error)[33](
public ‘errors’ =>
array(
‘http_request_failed’ =>
array(
0 => string ‘Could not resolve host: www.bitcoinicau.com;
)
)
public ‘error_data’ =>
array(
empty
)
)
|
Улучшенная версия нашего скрипта может быть:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
<?php
/*
Plugin Name: Bitcoinica Ticker
Plugin URI: http://mystore.com
Description: Retrieve Bitcoinica prices
Author: Abid Omar
Version: 1.0
*/
add_filter ( ‘template_redirect’ , function () {
$response = wp_remote_get ( ‘https://www.bitcoinica.com/api/quotes/BTCUSD.json’, array ( ‘sslverify’ => false ) );
if ( !is_wp_error ($response) ) {
echo $response[‘body’];
}
exit;
});
|
is_wp_error
проверяет, является ли переданная переменная объектом WP_Error
. Однако этого недостаточно, чтобы знать, что возвращенный ответ является действительным и успешным. 404 (страница не найдена) или 503 (услуга недоступна) является действительным ответом. Требуется дополнительная проверка кода состояния ответа. Это будет зависеть в основном от службы или веб-сайта, к которому вы обращаетесь.
WordPress имеет еще больше вспомогательных функций, которые извлекают данные из HTTP-ответа.
-
wp_remote_retrieve_body()
—wp_remote_retrieve_body()
только тело из ответа. -
wp_remote_retrieve_header()
— дает вам один заголовок HTTP на основе имени из ответа. -
wp_remote_retrieve_headers()
— возвращает все заголовки HTTP в массиве для обработки. -
wp_remote_retrieve_response_code()
— дает номер для ответа HTTP. Это должно быть 200, но может быть 4xx или даже 3xx при сбое. -
wp_remote_retrieve_response_message()
— возвращает ответное сообщение на основе кода ответа.
Arguments Array
Вы можете лучше контролировать свои HTTP-запросы. Второй аргумент принимает массив пар ключ / значение. Вот краткое изложение наиболее важных из них:
- метод — при использовании метода
wp_remote_request
вы должны указать, какой метод запроса вы используете (GET, POST, HEAD, PUT и т. д.). Значением по умолчанию является GET - timeout — время в секундах до того, как WordPress разорвет соединение и вернет ошибку. Значение по умолчанию составляет 5 секунд, что является относительно коротким временем, если вы подключаетесь к медленному и загруженному серверу.
- перенаправление — указывает время, после которого следует выполнить переадресацию перед тем, как отказаться. По умолчанию сумма также составляет 5.
- cookies — массив значений cookie, передаваемых на сервер.
Для полного и более подробного списка, проверьте HTTP_API »Other_Arguments на веб-сайте кодекса WordPress.
Проверка SSL сертификата
Если вы внимательно посмотрели приведенный выше код, вы заметите, что я уже использую второй аргумент в функции wp_remote_get
и устанавливаю для sslverify
‘ sslverify
‘ значение false. Я сделал это, потому что на моем веб-сервере не установлены никакие центры сертификации и, следовательно, они не распознаются. Если вы хотите проверить хост, к которому вы подключаетесь, перед установкой соединения, вам понадобится список сертификатов, установленных на вашем веб-сервере.
Веб-браузеры распознают различные полномочия сертификатов. Когда сертификат подтвержден, веб-браузер доволен и показывает зеленый значок замка вверху. (Значок отличается от одного браузера к другому, но он почти всегда зеленый, и большую часть времени слева от адресной строки)
Если сертификат отклонен, соединение не устанавливается, и WP_Error
объект WP_Error
.
Вывод
Это было введение в WordPress HTTP API. В этом уроке мы изучили основы создания HTTP-запроса и чтения ответа. В следующем уроке мы узнаем, как использовать HTTP API для построения платежного шлюза PayPal и обработки экспресс-платежей.