Cоображения про метод DELETE. - 1С-ИнтеГрация

Cоображения про метод 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 = Неопределено;
    
КонецПроцедуры

Источник

Назад в раздел