IE2017

Реализация в 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\n";
    var_dump($_PUT);
} else if($_SERVER['REQUEST_METHOD'] == 'DELETE') {
    echo "DELETE\n";
    // параметры не нужны!
    //var_dump($_DELETE);
} else if($_SERVER['REQUEST_METHOD'] == 'POST') {
    echo "POST\n";
    var_dump($_POST);
} else if($_SERVER['REQUEST_METHOD'] == 'GET') {
    echo "GET\n";
    var_dump($_GET);
} else {
    echo "BAD\n";
}

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

Скачать файлы

Наименование Файл Версия Размер
Пример реализцации работы RESTful API
.zip 4,83Kb
09.12.16
6
.zip 1.0.0 4,83Kb 6 Скачать

См. также

В этой теме еще нет сообщений.
Оставьте свое сообщение