Использование метода DELETE в объекте HTTPСоединение

Опубликовал Vlad (vld_trade) в раздел Обмен - Интеграция с WEB

Методы GET и POST разжеваны на портале как надо.
Я поделюсь своими соображениями про метод DELETE.

Не секрет, что платформа 1С8 (8.2, 8.3) неполноценно поддерживает методы PUT и DELETE в объекте HTTPСоединение.

Два дня поиска решения в Интернет привели к выводу использовать COMОбъект WinHttpRequest. Я уж было обрадовался, что раздобыл такой интереснейший инструментик, но и тут меня ожидал сюрприз: не все сайты поддерживают свойство этого объекта SetCredentials.

Суть в том, что сервер должен запросить авторизацию и только тогда свойство SetCredentials(ИмяПользователя, Пароль, 0) сработает.

Спасибо пользователю torgm, который в ветке http://www.forum.mista.ru/topic.php?id=654266 описал свои поиски для платформы 7.7. Суть его доработки заключается в добавлении заголовка "Autorization" для WinHttpRequest с одновременным кодированием строки "ИмяПользователя:Пароль" в base64.

Итого: здесь я выкладываю рабочий код для платформ 8.2/8.3 (проверено на последних (или почти последних) релизах платформ.

Прикрепленная обработка включает в себя работу:

 - со стандартным HTTPСоединение (в синтаксисе работы с запросом, т.к. для меня было важно при ошибке 400 не вылетать с исключением);

 - метода DELETE с передачей тела запроса (именно то, что не умеет делать 1С) с использованием WinHttpRequest;

 - ну и стандартного GET, который 1С поддерживает на ура.

Преобразование в base64, слава Богу, делается стандартными средствами 1С:

Функция Кодировать(СтрокаКодирования)
	
	ИмяОченьВременногоФайла = ПолучитьИмяВременногоФайла();
	ЗаписьТекста = Новый ЗаписьТекста(ИмяОченьВременногоФайла, СокрЛП(Кодировка));
	ЗаписьТекста.Записать(СтрокаКодирования);
	ЗаписьТекста.Закрыть();
	ЗакодированнаяСтрока = Base64Строка(Новый ДвоичныеДанные(ИмяОченьВременногоФайла));
	
	Попытка
		УдалитьФайлы(ИмяОченьВременногоФайла);
	Исключение
		Возврат СтрокаКодирования;
	КонецПопытки;
	
	Возврат ЗакодированнаяСтрока;
	
КонецФункции

Обращение к приведенной выше функции происходит в процедуре, в которой требуется авторизация для объекта WinHttpRequest:

Процедура ЗапросНаУдаление()
	
	//Только для удаления вагона надо воспользоваться сторонними механизмами,
	//т.к. методы PUT и DELETE не поддерживаются объектом HTTPСоединение
	
	WinHttpReq = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
	Если WinHttpReq = Неопределено Тогда
		Сообщить("Ошибка создания объекта WinHTTP... Обработка прервана.");
		Возврат;
	КонецЕсли;
	//Скриптовальщик = Новый COMОбъект("MSScriptControl.ScriptControl");
	//Если Скриптовальщик = Неопределено Тогда
	//	Сообщить("Ошибка создания объекта MSScriptControl... Обработка прервана.");
	//	Возврат;
	//КонецЕсли;
	//Скриптовальщик.language="javascript";
	//Скриптовальщик.AddObject("WinHttp", WinHttpReq);
	//Скриптовальщик.Eval("WinHttp.Option(2)=1251");
	//Скриптовальщик = Неопределено;
	
	WinHttpReq.Open("DELETE", "http://" + СокрЛП(АдресСервера) + "/" + СокрЛП(АдресРесурса));
	
	WinHttpReq.setRequestHeader("Content-Charset", СокрЛП(Кодировка)); 
	WinHttpReq.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=" + СокрЛП(Кодировка)); 
	WinHttpReq.SetRequestHeader("Content-Length", СокрЛП(СтрДлина(СокрЛП(СтрокаЗапроса))));
	WinHttpReq.SetRequestHeader("Authorization"," Basic " + Кодировать(СокрЛП(ЛогинНаСервер) + ":" + СокрЛП(ПарольНаСервер)));
	
	ТелоЗапроса = СокрЛП(СтрокаЗапроса);
	WinHttpReq.Send(ТелоЗапроса);
	Статус = WinHttpReq.Status;
	Если Статус = 200 Тогда
		//Все ок, ничего не делаем
	ИначеЕсли Статус = 401 Тогда
		//некорректная авторизация
		Сообщить("Возможно, Вы ввели неправильный логин и (или) пароль. Обработка прервана.");
	ИначеЕсли Статус = 407 Тогда
		//Надо авторизоваться на прокси сервере
		//WinHttpReq.SetProxy();
		//WinHttpReq.SetCredentials("", "", 1);
		Сообщить("Разработчик не предусмотрел использование прокси-сервера. Обработка прервана.");
	КонецЕсли;
	
	Сообщить("" + СокрЛП(WinHttpReq.Status) + "   " + СокрЛП(WinHttpReq.StatusText));
	ТекстОтвета = СокрЛП(WinHttpReq.ResponseText());
	Если НЕ ТекстОтвета = "" Тогда
		Сообщить(WinHttpReq.ResponseText());
	КонецЕсли;
	
	WinHttpReq = Неопределено;
	
КонецПроцедуры
 

Удачи всем в поисках истины!

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

Наименование Файл Версия Размер
Внешняя обработка
.epf 14,17Kb
11.09.13
10
.epf 1.0 14,17Kb 10 Скачать

См. также

Комментарии
1. Алексей 1 (AlX0id) 13.09.13 09:03 Сейчас в теме
Плюсик за то, что заставил прочитать, что же делает этот запрос ))
2. Сергей Ожерельев (Поручик) 3516 13.09.13 10:16 Сейчас в теме
3. Vlad (vld_trade) 25 13.09.13 10:42 Сейчас в теме
Если бы эти статьи читали разработчики API, нам бы всем жилось намного легче ;)
Я столкнулся с тем, что "На сервер ДОЛЖЕН приходить DELETE запрос с информацией в теле запроса". Точка.
Даже сейчас, когда механизмы обмена информацией с порталом полностью отлажены, response сервера на мой DELETE request всегда отвечает "200", независимо от того, произведено ли реальное удаление ресурса или он был удален ранее...