Страницы

24 ноября 2018

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

Продолжая первую и вторую статью про HTTP-сервисы 1С, сегодня рассмотрим более детально передачу JSON данных из веб-страницы на языке PHP в HTTP-сервис 1С по протоколу POST.

Содержание:

1. Вспоминаем прошлые статьи по HTTP-сервису

2. Создаем новый шаблон и метод
3. Обработчик 1С получения JSON данных с сайта
4. Код веб-страницы на PHP для отправки JSON данных
5. Проверка работоспособности


1. Вспоминаем прошлые статьи по HTTP-сервису

В первой статье мы создали чистую конфигурацию test. В нее добавили один справочник Оборудование, заполнили его тремя записями. Добавили HTTP-сервис СписокОборудования с Корневым URL - ob. Опубликовали конфигурацию под именем test. Во второй статье используя методы GET и POST попытались организовать получение параметров с сайта. Но полноценно рассматривать получение данных JSON методом POST не стали, это рассмотрим в данной статье.

2. Создаем новый шаблон и метод

В HTTP-сервисе СписокОборудования добавляем новый шаблон URL ИнформацияПоОборудованию в свойстве Шаблон указываем /poastjson




В созданном шаблоне URL создаем новый метод POSTJSON, в нем создаем обработчик.







3. Обработчик 1С получения JSON данных с сайта


Функция ИнформацияПоОборудованиюPOSTJSON(Запрос)
//получаем тело запроса 
Сообщение = Запрос.ПолучитьТелоКакСтроку("UTF-8"); 
//десериализуем данные о клиенте из JSON 
ЧтениеJSON = Новый ЧтениеJSON; 
ЧтениеJSON.УстановитьСтроку(Сообщение); 
ОборудованиеJSON = ПрочитатьJSON(ЧтениеJSON); 
ЧтениеJSON.Закрыть();
//обрабатываем JSON данные
ДанныеОборудования = Новый Структура; //Создаем структуру для хранения ответа
КодОборудования = "";
НаименованиеОборудования = "";
Если ОборудованиеJSON.Свойство("code", КодОборудования) Тогда   
//Если есть свойство Код, то ищем по коду элемент в справочнике
Оборудование = Справочники.Оборудование.НайтиПоКоду(КодОборудования); 
Если ЗначениеЗаполнено(Оборудование) Тогда 
//Если найден такой элемент, то добавляем данные элемента в структуру
ДанныеОборудования.Вставить("code", Оборудование.Код);
ДанныеОборудования.Вставить("naim", Оборудование.Наименование);
КонецЕсли; 
ИначеЕсли ОборудованиеJSON.Свойство("naim", НаименованиеОборудования) Тогда 
//Если есть свойство Наименование, то ищим по наименованию элемент в справочнике
Оборудование = Справочники.Оборудование.НайтиПоНаименованию(НаименованиеОборудования); 
Если ЗначениеЗаполнено(Оборудование) Тогда 
//Если найден такой элемент, то добавляем данные элемента в структуру
ДанныеОборудования.Вставить("code", Оборудование.Код);
ДанныеОборудования.Вставить("naim", Оборудование.Наименование); 
КонецЕсли;
Иначе   //Если нет свойства Код и Наисенования, то что-то передали не то
Ответ = Новый HTTPСервисОтвет(402);
Возврат Ответ;
КонецЕсли; 
//Если не были найдены элементы и по коду ни по наименованию
//формируем пустую структуру
Если Не ЗначениеЗаполнено(ДанныеОборудования) Тогда
ДанныеОборудования.Вставить("code", null);
ДанныеОборудования.Вставить("naim", null);
КонецЕсли;
//Сериализуем данные в JSON
ЗаписьJOIN = Новый ЗаписьJSON;
ЗаписьJOIN.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJOIN,ДанныеОборудования);
СтрокаДляОтвета = ЗаписьJOIN.Закрыть();
//Формируем ответ клиенту
Ответ = Новый HTTPСервисОтвет(200);
Ответ.Заголовки.Вставить("Content-type","application/JOIN; charset=utf-8");
Ответ.УстановитьТелоИзСтроки(СтрокаДляОтвета,КодировкаТекста.UTF8,ИспользованиеByteOrderMark.НеИспользовать);
Возврат Ответ;
КонецФункции

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

4. Код веб-страницы на PHP для отправки JSON данных

<?php
//Авторизация
$username = "Администратор";
$password = "1";
$host_api = "http://1с/test";
$host_post = "http://1с/test/hs/ob/postjson";

$data = array
(
//"code" => "000000004", //поиск по коду
"naim" => "Монитор" //поиск по наименованию
);
$json_data = json_encode($data);

$ch = curl_init($host_api);

// Заполняем параметры CURL для получения данных по запросу POST
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
curl_setopt($ch, CURLOPT_USERPWD, $username . ":" . $password);
curl_setopt($ch, CURLOPT_URL, $host_post);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $json_data);

//Если передавать ничего не надо, то вместо $json_data нужно передать NULL, иначе запрос не выполнится curl_setopt($ch, CURLOPT_POSTFIELDS, NULL);


// Выполнение запроса и получение ответа
$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 в браузер
?>


5. Проверка работоспособности


Запускаем браузер, указываем URL веб-страницы.
Результат поиска по коду "000000004":


Результат поиска по наименованию "Монитор":

4 комментария:

  1. Спасибо большое! Кучу времени потратил, пока не нашел эту статью!

    ОтветитьУдалить
  2. Привет, почему во всех примерах ЗаписьJOIN?

    ОтветитьУдалить
    Ответы
    1. Во всех примера работаю по одной записи, для реализации не сложных и не объемных модулей этого достаточно.

      Удалить