Статьи

Создайте пользовательский API в OpenCart

Вам нужно будет создать пользовательские API для уникальных требований при разработке вашего проекта в какой-то момент времени, и об этом мы расскажем на протяжении всего курса. В нашем пользовательском модуле API мы извлечем список всех продуктов, доступных в магазине, и это будет вывод в формате JSON, как того требуют стандарты REST в OpenCart.

Я предполагаю, что вы знакомы с базовым процессом разработки модулей в OpenCart. Вот хорошая статья, предоставляющая исчерпывающее понимание предмета на тот случай, если вы захотите пропустить его. Еще один важный момент: я использую последнюю версию OpenCart, то есть 2.1.0.2 на момент написания этой статьи, и вы должны сделать это тоже, чтобы обеспечить совместимость основных API.

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

Давайте посмотрим на список файлов, необходимых для желаемой настройки.

  • catalog/controller/api/custom.php : это файл контроллера, и большая часть нашей логики приложения находится в этом файле.
  • catalog/language/en-gb/api/custom.php : Это языковой файл, который содержит языковые переменные.
  • common.php : Этот файл содержит общий код для повторного использования.
  • login.php : это файл, который демонстрирует, как войти в магазин, используя REST API.
  • products.php : это файл, который демонстрирует, как получать продукты с помощью нашего пользовательского модуля API.

Итак, это все, что нужно, чтобы настроить наш пользовательский модуль API и протестировать его с помощью библиотеки PHP CURL.

Мы начнем с файла контроллера, продолжим и создадим файл catalog/controller/api/custom.php со следующим содержимым.

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
<?php
// catalog/controller/api/custom.php
class ControllerApiCustom extends Controller {
  public function products() {
    $this->load->language(‘api/custom’);
    $json = array();
 
    if (!isset($this->session->data[‘api_id’])) {
      $json[‘error’][‘warning’] = $this->language->get(‘error_permission’);
    } else {
      // load model
      $this->load->model(‘catalog/product’);
 
      // get products
      $products = $this->model_catalog_product->getProducts();
      $json[‘success’][‘products’] = $products;
    }
     
    if (isset($this->request->server[‘HTTP_ORIGIN’])) {
      $this->response->addHeader(‘Access-Control-Allow-Origin: ‘ . $this->request->server[‘HTTP_ORIGIN’]);
      $this->response->addHeader(‘Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS’);
      $this->response->addHeader(‘Access-Control-Max-Age: 1000’);
      $this->response->addHeader(‘Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With’);
    }
 
    $this->response->addHeader(‘Content-Type: application/json’);
    $this->response->setOutput(json_encode($json));
  }
}

Вероятно, это должны быть довольно знакомые вещи, если вы знаете структуру файлов модулей OpenCart. Однако мы обсудим важные фрагменты из метода products .

Прежде всего, мы должны проверить подлинность запроса, и это проверяется наличием переменной api_id в активном сеансе. В случае действительного и аутентифицированного запроса, мы пойдем дальше и получим все продукты, используя метод getProducts базовой модели Product . Конечно, он выдаст сообщение об ошибке «Отказано в доступе» в случае неверного входа в систему.

Далее следует общая проверка безопасности для защиты от CSRF-атак. Это достигается путем проверки существования переменной HTTP_ORIGIN и добавления соответствующих заголовков, если она существует.

Наконец, мы использовали функцию json_encode для кодирования массива $products , и результат передается в качестве аргумента метода setOutput .

Далее мы создадим языковой файл для нашего модуля по адресу catalog/language/en-gb/api/custom.php со следующим содержимым.

1
2
3
4
<?php
// catalog/language/english/api/custom.php
// Error
$_[‘error_permission’] = ‘Warning: You do not have permission to access the API!’;

Итак, вот и все, что касается настройки файлов, связанной с OpenCart. В следующем разделе мы создадим файлы, которые помогут нам протестировать наш пользовательский API с использованием библиотеки PHP CURL.

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

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

common.php создайте файл common.php и вставьте в него следующее содержимое.

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
<?php
function do_curl_request($url, $params=array()) {
  $ch = curl_init();
  curl_setopt($ch,CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_COOKIEJAR, ‘/tmp/apicookie.txt’);
  curl_setopt($ch, CURLOPT_COOKIEFILE, ‘/tmp/apicookie.txt’);
 
  $params_string = »;
  if (is_array($params) && count($params)) {
    foreach($params as $key=>$value) {
      $params_string .= $key.’=’.$value.’&’;
    }
    rtrim($params_string, ‘&’);
 
    curl_setopt($ch,CURLOPT_POST, count($params));
    curl_setopt($ch,CURLOPT_POSTFIELDS, $params_string);
  }
 
  //execute post
  $result = curl_exec($ch);
 
  //close connection
  curl_close($ch);
 
  return $result;
}

Как видите, он содержит только одну функцию do_curl_request , которая будет вызывать CURL для URL-адреса, переданного аргументом $url . Второй аргумент — это массив параметров на случай, если вам нужно POST-данные.

Другие важные вещи, на которые следует обратить внимание, это настройки CURLOPT_COOKIEJAR и CURLOPT_COOKIEFILE . Они устанавливают файл, в котором файлы cookie будут храниться и считываться. Поскольку нам нужно совершать аутентифицированные звонки, это обязательно! Конечно, вы хотите изменить путь /tmp/apicookie.txt соответствии с настройками вашей системы. Убедитесь, что он также доступен для записи на веб-сервере!

Наконец, функция возвращает ответ на запрос CURL!

Очевидно, что первое, что нужно сделать, это начать сеанс, и вам нужно будет использовать метод входа в систему. Давайте посмотрим на пример. login.php файл login.php со следующим содержимым.

01
02
03
04
05
06
07
08
09
10
11
12
<?php
require «common.php»;
 
$url = ‘http://your-opencart-store-url/index.php?route=api/login’;
 
$fields = array(
  ‘username’ => ‘demouser’,
  ‘key’ => ‘ysvF7M1nqNYiZV3GFtU252jhn0FrCWMdH8Kw8qR6DApZ7RSJWCN7S0IvIxnti1QP2wUNsYCaG6vHa2l2q8FTFbWNwNYQUO58CfSYJHHJRG0vt7OBN60BnE5MdEVLBSSJVBZJ7ioFuiAmQN1dmBO56dmaawULlY8lnWFXQimecZznUo7NCJHp3rkL1tOAYgeIUl1oVjzrZ7cayikQEvUtwIGj7Ai4XudDH70E7hKGNJcXPiY5RfgFI8PQ8eLg1FZJ’,
);
 
$json = do_curl_request($url, $fields);
var_dump($json);

Во-первых, мы включили файл common.php созданный в предыдущем разделе. Затем переменная $url определяет URL-адрес входа API магазина OpenCart. Далее, массив $fields содержит учетные данные пользователя API, созданные ранее.

Наконец, мы вызываем метод do_curl_request для входа в систему. Важно, что вы должны увидеть переменную токена в объекте $json . Запишите значение этой переменной, поскольку нам нужно будет передать его при выполнении последующих вызовов API.

Далее, давайте создадим файл products.php со следующим содержимым.

1
2
3
4
5
6
7
8
<?php
require «common.php»;
 
$url = ‘http://your-opencart-store-url/index.php?route=api/custom/products&token=GtULQW9ZMhhHLi3ooobDukIqTmqOZ1fJ’;
$json = do_curl_request($url, $fields);
$data = json_decode($json);
 
var_dump($data);

Важный фрагмент, который следует отметить в приведенном выше примере, — это переменная строки запроса маршрута. Для него установлено значение api/custom/products , которое по соглашению вызывает метод products определенный в custom.php контроллера custom.php созданном в начале этого урока. Кроме того, мы передали переменную токена вместе с ее значением, чтобы убедиться, что у нас есть доступ к API.

В любом случае, нас интересует правильный кодированный в JSON вывод в переменной $data . И это то, что вы должны увидеть при запуске файла products.php ! Он должен работать сразу после установки, если вы создали надлежащие учетные данные пользователя и настроили файлы, как описано.

Это лишь поверхностное представление о том, на что способен REST API в OpenCart. В нашем случае это был довольно простой, но эффективный пример для демонстрации темы. Сказав это, вы можете расширить его и реализовать индивидуальные решения в соответствии с вашими требованиями.

Вот и все для сегодняшней статьи. Не стесняйтесь задавать вопросы и оставлять свои предложения, поскольку они ценны!

Сегодня мы обсудили, как можно создать собственный API в OpenCart, создав собственный модуль. В процессе мы прошли весь рабочий процесс для достижения вышеупомянутой функциональности.

Вы можете связаться со мной через раздел новостей ниже, и я также провожу немного времени в Твиттере, если вы предпочитаете связаться со мной там!