Статьи

Создание WordPress-дружественного API Wrapper: основы

При создании веб-сайта или веб-приложения довольно распространенным требованием может быть необходимость извлечения данных со стороннего сайта или приложения. Если у этого сайта или приложения есть API, это отличный способ получить необходимые данные. Итак, давайте посмотрим, как это сделать с помощью WordPress.


Прежде чем мы перейдем к мелочам, давайте удостоверимся, что мы все в курсе нескольких вещей, начиная с того, что такое API.

Для целей данного руководства, когда мы говорим «API» (интерфейс прикладного программирования), мы конкретно подразумеваем, что классы Википедии называются « Web API »:

Веб-API на стороне сервера — это программный интерфейс к определенной системе сообщений запроса-ответа, обычно выражаемой в формате JSON или XML, которая предоставляется через Интернет — чаще всего с помощью веб-сервера на основе HTTP.

Проще говоря: API — это способ для одного приложения запрашивать у другого приложения предварительно определенную информацию в (чаще всего) формате JSON или XML через стандартный веб-URL.

Понял? Хорошо, дальше …


Создание запроса к API может включать несколько этапов, и вам может потребоваться добавить дополнительные этапы, такие как проверка ошибок, кэширование, проверка и т. Д.

Википедия определяет функцию Wrapper следующим образом:

Функция-обертка — это функция в компьютерной программе, основная цель которой — вызвать вторую функцию без каких-либо дополнительных вычислений или вообще без них. Это также известно как метод делегирования. Функции обертки могут использоваться для ряда целей.

Это определение может звучать так, будто обертки — это просто избыточный код, но на самом деле они далеки от этого.


Создание оболочки для API позволяет нам быть дружелюбными ко всем. Позволь мне объяснить:

  • У API часто есть «ограничение скорости», то есть количество раз и частота, с которой вы можете связаться с ними. Обращение к API, превышающее ограничение скорости, может заблокировать вас, а для информации, которая не меняется регулярно, это создает ненужную нагрузку на API. Создавая обертку, мы можем реализовать наше собственное кэширование, чтобы мы реже связывались с API.
  • В дополнение к этому, если мы сделаем запрос к API с информацией, которая неправильно отформатирована или является неполной, это пустой запрос. Перед отправкой мы должны убедиться, что отправляемый нами запрос завершен и правильно отформатирован.
  • Иногда API может отправлять информацию обратно, которая не совсем отформатирована самым простым для нас способом. Наличие промежуточного слоя между разработчиком и API дает возможность при необходимости обрабатывать данные до того, как разработчик их получит.
  • Разработчики также не должны повторяться больше, чем необходимо. Если мы объединим все шаги, связанные с вызовом API, в оболочку, это упростит разработку с использованием соответствующего API.

Оболочки делают работу с API дружественной к разработчикам и API.

Итак, конкретные вещи, которые мы собираемся обработать нашим API:

  • Выполнение вызова API, когда разработчик запрашивает информацию
  • Проверка, чтобы убедиться, что действительные данные отправляются в API
  • Проверка, вернул ли API ошибку, а не полезные данные, и, соответственно, исправление
  • Кэширование ответов от API, так что если такой же запрос будет сделан за короткий промежуток времени, нам не нужно связываться с API
  • Корректировка возвращаемых данных для упрощенного использования

Мы также будем делать эти вещи дружественным к WordPress способом, таким как использование переходных процессов для кэширования и wp_remote_request для отправки запросов API.


API, который мы будем использовать в этом руководстве, — это Envato Marketplace API. Этот API предоставляет информацию об элементах и ​​пользователях на торговых площадках Envato , таких как ThemeForest , CodeCanyon и других.

Мы будем основывать нашу разработку на общедоступных наборах, что видно из документации по Envato Marketplace API . Также обратите внимание на столбец TTL (время жизни), который по сути является «пределом скорости» для этого API. Поскольку данные изменяются только с этой частотой, нет смысла запрашивать любой заданный набор чаще, чем указанный TTL.

Итак, давайте начнем создавать базовый класс для взаимодействия с этим API.

Поскольку в конечном итоге это будет внутри примера плагина, к которому мы вернемся позже, давайте создадим эту файловую структуру и создадим оболочку API внутри.

Наш плагин будет показывать результаты набора API «random-new-files», поэтому мы назовем его «Wptuts + Random New». Итак, внутри вашего каталога wp-content / plugins / , создайте каталог с именем wptuts-random-new .

Теперь внутри этого каталога создайте новый каталог с именем envato-api-wrapper и файл внутри с именем class-envato-api-wrapper.php . Затем весь этот каталог можно будет скопировать в другие проекты, которым также потребуется использовать этот API в будущем.

Откройте файл * class-envato-api-wrapper.php , и начнем.

Сначала давайте определим наш класс:

1
2
3
4
5
6
<?php
class Envato_Marketplace_API {
 
    // All the things
 
}

Нам также понадобится простой способ протестировать эту оболочку при ее создании, не загружая весь WordPress. Итак, я просто создал файл index.php в каталоге envato-api-wrapper со следующим содержимым:

01
02
03
04
05
06
07
08
09
10
11
12
13
<?php
// We want to see errors during debugging
error_reporting(E_ALL);
ini_set(‘display_errors’, ‘1’);
 
// We need to use some WordPress functions
require( ‘../../../../wp-load.php’ );
 
// And we need our wrapper!
require( ‘class-envato-api-wrapper.php’ );
 
// Initialise our wrapper
$envato_api = new Envato_Marketplace_API();

Теперь вы должны иметь возможность перейти по http://localhost/wp-content/plugins/wptuts-random-new/envato-api-wrapper/ (замените «localhost» своей собственной средой разработки). Вы еще ничего не должны видеть, потому что оболочка еще ничего не делает. Если вы видите ошибку, еще раз проверьте код.

Примечание: не забудьте удалить этот файл или очистить его перед развертыванием в производство!

Первое, что вам нужно, прежде чем делать запрос к API, — это использовать базовый URL. Этот URL затем будет содержать различную информацию перед отправкой запроса.

В случае API Envato Marketplace мы будем использовать следующий URL:

1
http://marketplace.envato.com/api/edge/set.json

В этом URL есть две основные переменные биты информации: edgde и set .

Позиция edgde представляет версию API, которую мы хотим использовать, и, в частности, самую последнюю версию. Он будет одинаковым во всех запросах, однако, если что-то изменится, и мы захотим использовать более старую версию, мы могли бы, например, заменить ее на v3 .

Положение set представляет фактический набор данных, который мы запрашиваем. Слово «набор» является заполнителем, и мы заменим его соответствующими деталями при выполнении конкретного запроса.

Давайте добавим свойство $api_url в наш класс с этим значением:

1
2
3
4
5
6
<?php
class Envato_Marketplace_API {
 
    protected $api_url = ‘http://marketplace.envato.com/api/edge/set.json’;
 
}

Обратите внимание, что мы указали, что это свойство protected . Мы сделали это потому, что не хотим, чтобы URL-адрес изменялся напрямую другим кодом за пределами нашей оболочки.

Прежде чем мы попытаемся сделать конкретный запрос, мы добавим в наш класс универсальный метод, который будет обрабатывать выполнение любого запроса. Мы назовем его remote_request , и все, что ему потребуется, — это URL, на который нужно отправить запрос.

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
protected function remote_request( $url ) {
 
    // Firstly, if the URL is empty, don’t send a request
    if ( empty( $url ) ) {
        return false;
    }
 
    // Make the request
    $request = wp_remote_request( $url );
 
    // Check that WordPress was able to send the request, otherwise error
    if ( is_wp_error( $request ) ) {
        echo $request->get_error_message();
        return false;
    }
 
    // Decode the response so we can use it
    $data = json_decode( $request[‘body’] );
 
    if ( $request[‘response’][‘code’] == 200 ) {
        return $data;
    }
    else {
        return false;
    }
 
}

Обратите внимание, что мы снова указали, что этот метод « protected », чтобы не вызывать его напрямую из нашего класса.

Теперь, чтобы проверить, работает ли запрос, добавим наш первый метод API. В этом случае мы пойдем с набором random-new-files , который мы будем использовать позже в нашем примере плагина.

Добавьте следующий метод в наш класс:

01
02
03
04
05
06
07
08
09
10
11
public function random_new_files( $marketplace ) {
 
    // Create a URL for this request by replacing the ‘set’ placeholder with the set and any required parameters.
    $url = preg_replace( ‘/set/i’, ‘random-new-files:’ . $marketplace, $this->api_url );
 
    // Send a request to the API
    $results = $this->remote_request( $url );
 
    return $results;
 
}

Чтобы протестировать этот новый метод и, соответственно, добавить метод запроса API, добавьте следующую строку в наш файл отладки index.php :

1
echo ‘<pre>’ .

Теперь вы должны получить вывод в вашем браузере, похожий на этот:

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
29
30
31
32
33
stdClass Object
(
    [random-new-files] => Array
        (
            [0] => stdClass Object
                (
                    [id] => 4860464
                    [item] => Empire — Business, Portfolio HTML 5 Template
                    [url] => https://themeforest.net/item/empire-business-portfolio-html-5-template/4860464
                    [user] => designthemes
                    [thumbnail] => http://1.s3.envato.com/files/57931279/thumb-html.png
                    [sales] => 0
                    [rating] => 0.0
                    [cost] => 15.00
                )
 
                …
 
            [9] => stdClass Object
                (
                    [id] => 4852371
                    [item] => eplie |
                    [url] => https://themeforest.net/item/eplie-mobile-htmlcss-portfolio-template/4852371
                    [user] => cosmincotor
                    [thumbnail] => http://1.s3.envato.com/files/57831617/thumbnail.png
                    [sales] => 3
                    [rating] => 0.0
                    [cost] => 8.00
                )
 
        )
 
)

Предполагая, что вы видели что-то подобное, это означает, что оно работает, и вы получили данные из API. Успех!


Теперь мы получили основу для оболочки, все идет полным ходом. В следующей части мы закончим обертку и создадим виджет, который ее использует.

Кроме того, имейте в виду, что в то время как эта обертка создается для API Envato Marketplace, та же самая концепция (и большая часть того же самого кода до сих пор) может использоваться для создания обертки для любого RESTful API.

Сообщите нам в комментариях, какие у вас есть идеи по работе с API и WordPress.