Страницы

19 ноября 2018

HTTP-сервис 1С 1 часть




Сегодня расскажу
про HTTP-сервисы, которые появились в платформе версии 8.3.5. Для работы с HTTP-сервисами необходим WEB-сервер: IIS или Apache.
    HTTP-сервисы предназначены для интеграции обмена данными со сторонними приложениями используя формат JSON.


    Содержание:
    1. Создание HTTP-сервиса
    2. Публикация HTTP-сервиса
    3. Проверка работоспособности HTTP-сервиса
    4. Отладка HTTP-сервиса
    5. Создание страницы на языке PHP для работа с HTTP-сервисом
    6. Авторизация на PHP для доступа к HTTP-сервису


1. Создание HTTP-сервиса

    Создаем пустую конфигурацию. Добавляем один справочник Оборудование, в нем больше настраивать ни чего не будем.




    Заполняем наш справочник.

    В ветке Общие / HTTP-сервисы создаем сервис СписокОборудования. В свойстве Корневой URL обязательно указываем на латинском короткое название сервиса. Это свойство отвечает за формирование URL-адреса к методам сервиса.



    На закладке Шаблоны URL добавляем шаблон ЛистингОборудования для методов. В нем создаем метод на латинском ObListAll. Он отвечает за формирование URL-адреса к этому методу. В свойстве HTTP-метод указываем GET.



    Наиболее популярные методы:
    GET: Используется для запроса содержимого указанного ресурса. То есть, когда в браузере вводим URL адрес, мы тем самым запрашиваем содержимое ресурса, к примеру yandex.ru.
    POST: Применяется для передачи пользовательских данных заданному ресурсу. Часто встречается, когда мы на сайте заполняем форму и отправляем данные ресурсу или закачиваем на сайт рисунки, фотографии.

    В свойстве Обработчик создаем новый обработчик.

Функция ЛистингОборудованияObListAll(Запрос)

     //Формируем массив оборудования

     Оборудование = Справочники.Оборудование.Выбрать();
     МассивОборудования = Новый Массив;
     Пока Оборудование.Следующий() Цикл
          ДанныеОборудования = Новый Структура;
          ДанныеОборудования.Вставить("Code", Оборудование.Код);
          ДанныеОборудования.Вставить("Naim", Оборудование.Наименование);
          МассивОборудования.Добавить(ДанныеОборудования);
     КонецЦикла
     
     //Сериализуем массив в JSON
     ЗаписьJOIN = Новый ЗаписьJSON;
     ЗаписьJOIN.УстановитьСтроку();
     ЗаписатьJSON(ЗаписьJOIN,МассивОборудования);
     СтрокаДляОтвета = ЗаписьJOIN.Закрыть();

     //Формируем ответ веб-клиенту
     Ответ = Новый HTTPСервисОтвет(200);
     Ответ.Заголовки.Вставить("Content-type","application/JOIN; charset=utf-8");
     Ответ.УстановитьТелоИзСтроки(СтрокаДляОтвета,КодировкаТекста.UTF8,
     ИспользованиеByteOrderMark.НеИспользовать);
     Возврат Ответ;

КонецФункции


2. Публикация HTTP-сервиса

     Осуществим публикацию нашего сервиса выполнив пункты меню Администрирование / Публикация WEB-сервера...

     Указываем латинское имя конфигурации - test.

     На вкладке HTTP-сервисы проверяем факт выбора созданного нами сервиса.
     Жмем кнопку Опубликовать. После публикации 1С попросит перезапустить WEB-сервер – соглашаемся. 

3. Проверка работоспособности HTTP-сервиса

     Определимся, по какому URL нужно обратиться, чтобы протестировать HTTP-сервис. 
     Строка URL HTTP-сервиса формируется как:
     HTTP://<ИмяСервера>:порт>/<ИмяКонфигурации>/hs/<КорневойURL>/<Шаблон> 

     где:
     ИмяСервера = localhost (или название вашего ПК, или доменное имя)
     Порт = 8080 (можно не указывать, по умолчанию 80 порт)
     ИмяКонфигурации = test 
     hs – означает, что обращаемся к HTTP-сервисам
     КорневойURL = ob 
     Шаблон = ObListAll 
     
     В результате получаем: http://localhost/test/hs/ob/ObListAll 
     Внимание! Путь чувствителен к регистру!

     Сформированный URL-адрес вводим в браузер. После нажатия Enter скачается файл или отобразится содержимое в формате JSON. Этот файл можно открыть блокнотом и посмотреть что он содержит.



4. Отладка HTTP-сервиса


     Для отладки кода в момент обращения клиента к HTTP-сервису, необходимо в пункте меню Отладка / Подключение открыть окно Автоматическое подключение и поставить галку в пункте HTTP-сервисы. 



     В коде метода поставить точку остановы и обратиться по адресу http://localhost/test/hs/ob/ObListAll в браузере.

5. Создание страницы на языке PHP для работа с HTTP-сервисом


     Просто по URL скачивать файл не интересно, предлагаю написать простую WEB-страницу на языке PHP для отображения полученного ответа от HTTP-сервиса. 

     Для себя определил два способа обращения к HTTP-сервисам: file_get_contents() и curl. Сurl имеет больше настроек и возможностей. В примере ниже покажу эти два варианта.

     Создаем php файл с текстом: 

<?php

//Первый способ
// Получение файла JSON используя file_get_contents($url)

$url ='http://localhost/test/hs/ob/ObListAll';

$output = file_get_contents($url, false);

/*
//Второй способ
//Получение файла JSON используя curl
//Инициализация
$ch = curl_init();

// Заполняем параметры CURL для получения данных по запросу GET

curl_setopt($ch, CURLOPT_URL, 'http://localhost/test/hs/ob/OblistAll');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);


// Выполнение запроса и получение ответа
$output = curl_exec($ch);

// Проверка наличия ошибок 
if ($output === FALSE) {

    echo "cURL Error: " . curl_error($ch);

}

//Выводим сервисную информацию по выполнению запроса
$info = curl_getinfo($ch);

echo 'Took ' . $info['total_time'] . ' seconds for url ' . $info['url'];

// Очистка ресурсов
curl_close($ch);
*/

echo "<br>";
echo "<br>";

$obj = json_decode($output,true);

echo "Выводит все содержимое JSON";
echo "<br>";
var_dump($obj); // Выводит все содержимое JSON в браузер

echo "<br>";
echo "<br>";
echo "Выводит одну запись из массива JSON";
echo "<br>";
$Code = $obj[1]['Code'];
echo $Code;
echo "<br>";
$Naim = $obj[1]['Naim'];
echo $Naim;

echo "<br>";
echo "<br>";
echo "Выводит циклически из массива JSON все записи";
echo "<br>";
foreach($obj as $key => $value)
       {
foreach($obj[$key] as $key => $value)
               {
               echo $key.':'.$value.PHP_EOL;
       echo "<br>";
       }
        }
?>

     Результат выполнения




     При втором способе через  CURL можно получить сервисную информацию, к примеру время выполнения запроса и URL запроса: Took 0.016 seconds for url http://localhost/test/hs/ob/OblistAll

6. Авторизация на PHP для доступа к HTTP-сервису

     Последнее что в этой статье хочу затронуть, это авторизация HTTP-клиента на HTTP-сервисе.

     В конфигурации добавляем роль Администратор, даем ему полные права. Создаем нового пользователя Администратор с ролью Администратор и паролем 1.
     Теперь страницы написанные на PHP просто так обратиться к HTTP-сервису не смогут. Нужно выполнить авторизацию. Для этого наш код нужно дописать. Ниже представлен полный код PHP файла с возможностью авторизации на HTTP-сервисе 1С:

<?php

/*
//Первый способ
// Получение файла JSON используя file_get_contents($url)

//отправляем запрос с параметрами
$username = "Администратор";
$password = "1";
$auth = base64_encode("$username:$password"); //Создаем строку авторизации 
//по типу Basic auth, для авторизации в веб-сервисе
$context = stream_context_create([
'http' => [
'method' => "GET",
'header' => "Authorization: Basic $auth"
]
]);

$url ='http://localhost/test/hs/ob/OblistAll';

$output = file_get_contents($url, false, $context);
*/


//Второй способ
//Получение файла JSON используя curl

//Авторизация
$username = "Администратор";
$password = "1";
$host_api = "http://localhost/test";
$ch = curl_init($host_api);

// Заполняем параметры CURL для получения данных по запросу GET
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); 
curl_setopt($ch, CURLOPT_USERPWD, $username . ":" . $password); 
curl_setopt($ch, CURLOPT_URL, 'http://localhost/test/hs/ob/OblistAll');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);


// Выполнение запроса и получение ответа
$output = curl_exec($ch);

// Проверка наличия ошибок 
if ($output === FALSE
    {
     echo "cURL Error: " . curl_error($ch);
    }

//Выводим сервисную информацию по выполнению запроса
$info = curl_getinfo($ch);

echo 'Took ' . $info['total_time'] . ' seconds for url ' . $info['url'];

// Очистка ресурсов
curl_close($ch);


echo "<br>";
echo "<br>";

$obj = json_decode($output,true);

echo "Выводит все содержимое JSON";
echo "<br>";
var_dump($obj); // Выводит все содержимое JSON в браузер

echo "<br>";
echo "<br>";
echo "Выводит одну запись из массива JSON";
echo "<br>";
$Code = $obj[1]['Code'];
echo $Code;
echo "<br>";
$Naim = $obj[1]['Naim'];
echo $Naim;

echo "<br>";
echo "<br>";
echo "Выводит циклически из массива JSON все записи";
echo "<br>";
foreach($obj as $key => $value)
       {
foreach($obj[$keyas $key => $value)
               {
               echo $key.':'.$value.PHP_EOL;
       echo "<br>";
       }
        }
?>

    P/S Было интересно разобраться в HTTP-сервисах 1С. В следующей статье поговорим о передачи параметров и методе POST. 

8 комментариев:

  1. Доброго времени! Уже организовал обмен с сайтом через HTTP сервис и JSON.
    Были интересны действия со стороны сайта, на PHP.
    Спасибо большое!

    ОтветитьУдалить
  2. Анонимный28 мая 2020 г., 22:36

    Спасибо. Очень полезно!

    ОтветитьУдалить
  3. Эта тема для меня новая, поэтому - плаваю. Большое спасибо за подробные пошаговые разъяснения.

    ОтветитьУдалить
  4. Это придумано какими-то идиотами не для людей.
    Пишут GET , т.е. 1С что-то получает из вне, а на деле она отдаёт список оборудования .....всё в этом сраном 1С наоборот, череж ЖО.

    ОтветитьУдалить
  5. Здравствуйте. Не могли бы про шаблон более подробно написать? Речь идет о третьем пункте. Сделал тестовую базу как у вас в примере. При обращении по URL к http сервису "ob" даже без "/list" файл все равно скачивается. Что нужно указывать в поле "Шаблон" у шаблона? И почему вы указали "/list"?

    ОтветитьУдалить
    Ответы
    1. Спасибо за уточнения. Опечатки исправил. Попробуйте еще раз. Если останутся вопросы, пишите.

      Удалить