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


Методы 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 = Неопределено;

КонецПроцедуры
 

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

4 Comments

  1. AlX0id

    Плюсик за то, что заставил прочитать, что же делает этот запрос ))

    Reply
  2. Поручик

    Метод DELETE http://www.novopromo.ru/http/rfc2068/63.html

    Типы HTTP-запросов и философия REST http://habrahabr.ru/post/50147/

    Reply
  3. vld_trade

    Если бы эти статьи читали разработчики API, нам бы всем жилось намного легче 😉

    Я столкнулся с тем, что «На сервер ДОЛЖЕН приходить DELETE запрос с информацией в теле запроса». Точка.

    Даже сейчас, когда механизмы обмена информацией с порталом полностью отлажены, response сервера на мой DELETE request всегда отвечает «200», независимо от того, произведено ли реальное удаление ресурса или он был удален ранее…

    Reply
  4. zfr475

    В моем случае, в Функции Кодировать(), вместо переменной «Кодировка» написал «CESU-8» и заработало! ЮТФ-8 мне не помог. Как я понял, «CESU-8» — это ютф-8 без ВОМ.

    Спасибо за статью!

    Reply

Leave a Comment

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