Мой опыт HTTP-сервисов в 1С

Посыпаю голову пеплом, но до некоторого времени я не знал, в чем разница между веб-сервисами и HTTP-сервисами в 1С. С первыми я достаточно плотно работал, а про существование других даже не догадывался.

Забавно, что перед тем, как начать работать с HTTP-сервисами, в одном из обсуждений я прочитал, что кандидату на должность программиста задавали как раз вопрос, чем эти два сервиса отличаются друг от друга.

Но на практике все оказалось просто. Веб-сервис — это сложный протокол SOAP. А для HTTP-сервиса достаточно написать строку в браузере (если речь о протоколе GET) и 1С может возвращать данные в любом формате по этому запросу — хоть JSON, хоть XML, хоть HTML.

По сути веб-сервис — это удаленный вызов функции, с вызывающей стороны требуется поддержка SOAP. А HTTP-сервис — это простейший вызов по http-адресу, его проще вызывать.

Написав пару простейших Get-запросов я отлаживал их на опубликованной на веб-сервере IIS файловой базе, набирая адрес запроса в адресной строке.

Я знаю, что можно отлаживать HTTP-сервисы, но такой возможностью не пользовался.

Метод-обработчик HTTP-сервиса вызывать в консоли кода нельзя, поэтому у меня эти обработчики просто тупо вызывали процедуры из модуля сервера, а уже эти процедуры я мог отладить в консоли:

Однако далее мне пришлось писать POST-запросы. Тут уже для вызова веб-сервера я использовал страницу reqbin.com/post-online. 1С на ИТС рекомендует использовать специальную программу, но ее надо скачивать и ставить, а тут можно проверить онлайн.

При этом нужно помнить, что нужно указать авторизацию, причем имя пользователя на русском этот сайт не понимает, завел пользователя на английском:

В адрес я ввожу адрес POST-запроса, выбираю метод POST, ввожу содержимое запроса (JSON) после чего нажимаю SEND и получаю ответ (JSON) в правом окошке.

Сначала ответ был не читаем, помогло правильное прописывание кодировки. Вот кстати, как возвращать ответ HTTP-сервиса:

Ответ = Новый HTTPСервисОтвет(200);
Ответ.Заголовки.Вставить(«Content-type», «application/json; charset=utf-8»);

ДЖ = Новый ЗаписьJSON();
ДЖ.УстановитьСтроку();
ДЖ.ЗаписатьНачалоОбъекта();
ДЖ.ЗаписатьИмяСвойства(«result»);       ДЖ.ЗаписатьЗначение(result);
ДЖ.ЗаписатьИмяСвойства(«message»);      ДЖ.ЗаписатьЗначение(message);

ДЖ.ЗаписатьКонецОбъекта();
СтрокаДЖ = ДЖ.Закрыть();

//Устанавливаем тело из JSON-строки
Ответ.УстановитьТелоИзСтроки(СтрокаДЖ);

Возврат
Ответ;

Однако по странному изгибу мысли заказчика у меня возникла проблема. Дело в том, что создание заказа выполнялось через часть URL post, а изменение заказа через часть URL post/guid.

Т.е. если раньше у меня был один шаблон URL на каждый метод, тут пришлось сделать два шаблона и я не сразу понял, как это должно выглядеть. Но потом догадался, в итоге вышло так:

orderCreate имеет шаблон /order, а orderWork имеет шабон /order/{ID}. Изначально я все это пытался впихнуть в один шаблон order, не вышло.

Соответственно, для отладки PATCH-запросов я использую тот же сайт, только выбираю метод PATCH.

Со временем я столкнулся с ошибкой, которую не смог выявить без отладки, поэтому написал небольшую обработку, где вводил JSON-текст запроса, а она уже имитировала вызов метода сервиса:

Вот её код, я здесь передаю настоящий, правда виртуальный, HTTPЗапрос:

&НаКлиенте
Процедура APIСозданияЗаказа(Команда)
   
APIСозданияЗаказаНаСервере();
КонецПроцедуры

Процедура
APIСозданияЗаказаНаСервере()
   
Запрос = Новый HTTPЗапрос;
   
Запрос.УстановитьТелоИзСтроки(ТекJSON);
   
обс_ВебСервер.orderPost(Запрос);
КонецПроцедуры

Удачи вам с HTTP-сервисами.

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

комментариев 5

  1. bob32:

    Нынче стыдно не знать принципы REST API. URL вида / для изменений объекта это канон REST API. Правда для большего канона стоит не POST а PUT делать, но это уже нюансы.

    Вообще, освой curl и тесть из command line-а. Еще есть утилитка httpie

    • bob32:

      Дурацкий редактор, в общем URL вида «path»/»id» для изменний объекта — это канон REST API.

    • зачем, если для тестировани http-сервисов достаточно обычных онлайн-инструментов.
      А так-то я помню когда-то даже веб-сервисы (SOAP) через CURL тестировал, ибо там был HTTPS с сертификатами (продажа авиабилетов Сирена, где то 2013-й год)

  2. Zuko:

    JSON прекрасно сериализуется из структуры. Зачем это делать ручками?

    Фраза «По сути веб-сервис — это удаленный вызов функции. А HTTP-сервис» осталась неоконченной

    • там большие объемы, сериализация в структуру — лишние потери скорости и памяти.
      Фразу дописал.

Добавить комментарий

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