Реализация в 1С архитектуры RESTful

Пример реализации запросов с 1С к серверу, по принципу RESTful.

REST (RESTful) — это общие принципы организации взаимодействия приложения/сайта с сервером посредством протокола HTTP.

Всё взаимодействие с сервером сводится к следующим операциям:

  1. получение данных с сервера (обычно в формате JSON, или XML)
  2. добавление новых данных на сервер
  3. модификация существующих данных на сервере
  4. удаление данных на сервере

Таким образом, данные HTTP-запросы будут иметь различную смысловую нагрузку в REST:

  • GET /object — Получаем данные Объекта
  • POST /object — Добавляем Объект
  • PUT /object — Изменяем(модифицируем) Объект
  • DELETE /object — Удаляем Объект

Т.е. :

  1. GET-запрос /rest/users — получение информации о всех пользователях
  2. GET-запрос /rest/users/125 — получение информации о пользователе с id=125
  3. POST-запрос /rest/users — добавление нового пользователя
  4. PUT-запрос /rest/users/125 — изменение информации о пользователе с id=125
  5. DELETE-запрос /rest/users/125 — удаление пользователя с id=125

Примерный код функции отправки запроса из 1С:

Функция ЗапросHTTP(ТипЗапроса)
//ТипЗапроса: POST, GET, PUL, DELETE

ПараметрГЕТ = "";
ТелоPOSTЗапроса = "";
Если ТипЗапроса="POST" или ТипЗапроса="PUT" Тогда
ТелоPOSTЗапроса = "parametr5=5&parametr6=6"; // POST (+для PUT)
ИначеЕсли ТипЗапроса="GET" Тогда
ПараметрГЕТ = "?parametr1=1&parametr2=2"; // GET
КонецЕсли;
АдресСтраницыНаСервере = "/test_restful.php"+ПараметрГЕТ; // ЗАПРОС

ЗащищенноеСоединение=Ложь;
Таймаут=30; // ждем ответ от сервера 30 сек

СерверПриемник = "domainname.ru"; //имя сервера без протокола (http) и порта

ЗаголовкиHTTP = Новый Соответствие;
ЗаголовкиHTTP.Вставить("Content-Type", "application/x-www-form-urlencoded");

SSL =  ?(ЗащищенноеСоединение, Новый ЗащищенноеСоединениеOpenSSL(), Неопределено);
НТТР = Новый HTTPСоединение(СерверПриемник, , , , , Таймаут, SSL);

резутатПолучен=Ложь;
Попытка
//Формируем HTTP запрос
ЗапросHTTP = Новый HTTPЗапрос(АдресСтраницыНаСервере, ЗаголовкиHTTP);
//Устанавливает строку, из которого будет прочитано тело POST-запроса.
ЗапросHTTP.УстановитьТелоИзСтроки(ТелоPOSTЗапроса);

//Ответ от сервера получим в возвращаемом значении типа HTTPОтвет
Если ТипЗапроса="GET" Тогда
ОтветHTTP = НТТР.ВызватьHTTPМетод("GET",ЗапросHTTP);
ИначеЕсли ТипЗапроса="POST" Тогда
ОтветHTTP = НТТР.ВызватьHTTPМетод("POST",ЗапросHTTP);
ИначеЕсли ТипЗапроса="PUT" Тогда
ОтветHTTP = НТТР.ВызватьHTTPМетод("PUT",ЗапросHTTP);
ИначеЕсли ТипЗапроса="DELETE" Тогда
ОтветHTTP = НТТР.ВызватьHTTPМетод("DELETE",ЗапросHTTP);
Иначе
ВызватьИсключение("Неизвестный запрос: "+ТипЗапроса+"!");
КонецЕсли;
резутатПолучен=Истина;
Исключение
ТекстСообщения = НСтр("ru = 'Неудачная попытка соединения с '")  + СерверПриемник + ": " + ОписаниеОшибки();
Сообщить("ПЛОХО "+ТекстСообщения);
КонецПопытки;

ПолученныеДанные="";

Если резутатПолучен Тогда
Если ОтветHTTP.КодСостояния = 200 Тогда
// теперь можно разбирать ответ
ЗаголовкиHTTP = ОтветHTTP.Заголовки;
ЗаголовкиHTTP.Вставить("StatusCode", ОтветHTTP.КодСостояния);
ПолученныеДанные = ОтветHTTP.ПолучитьТелоКакСтроку();
Иначе
Сообщить(ОтветHTTP.ПолучитьТелоКакСтроку());
КонецЕсли;
КонецЕсли;

//Возврат ПолученныеДанные;
Сообщить(ПолученныеДанные);

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

Пример серверной части принимающей запросы от 1С:

if($_SERVER['REQUEST_METHOD'] == 'PUT') {
$_PUT = array();
$putdata = file_get_contents('php://input');
$exploded = explode('&', $putdata);
foreach($exploded as $pair) {
$item = explode('=', $pair);
if(count($item) == 2) {
$_PUT[urldecode($item[0])] = urldecode($item[1]);
}
}

echo "PUT
";
var_dump($_PUT);
} else if($_SERVER['REQUEST_METHOD'] == 'DELETE') {
echo "DELETE
";
// параметры не нужны!
//var_dump($_DELETE);
} else if($_SERVER['REQUEST_METHOD'] == 'POST') {
echo "POST
";
var_dump($_POST);
} else if($_SERVER['REQUEST_METHOD'] == 'GET') {
echo "GET
";
var_dump($_GET);
} else {
echo "BAD
";
}

В файле приведен весь данный код, и собран в рабочий пример. Архив содержит два файла: обработка для 1С — выступающая в качестве клиента и обработка для сервера на php.

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *