Консоль HTTP-запросов с генерацией кода













Консоль HTTP-запросов, которая не только выполняет запросы и получает результат их выполнения, но и генерирует необходимый код. Использую на 8.3.11.2899.

UPD: Добавил авторизацию OAuth2, включил блок OAuth2 авторизации в генерируемый код.

При разработке очень часто сталкиваюсь с необходимостью взаимодействия со всякого рода сервисами (rest, soap), и возникает потребность начально отладить работу сервиса, так сказать «пощупать». Для этого использую приложение SoapUI, многие используют curl, и после отладки необходимо переносить все настройки в 1С, на ее классы и методы, что занимает некоторое время. Именно так и родилась консоль http-запросов для 1С. Сразу отмечу, что она покрывает только rest сервисы, для soap она не подойдет.

Консоль может не только выполнять запросы и получать результат их выполнения, но и генерировать необходимый код на языке 1С. 

Пробежимся по интерфейсу:

Настройки соединения, стоить отметить, что в поле сервер вносим только весь текст сервиса слева до домена верхнего уровня уровня (ru, com, org и т.п.)

Настройки соединения

Ссылка "Настройка прокси" открывает группу с настройками прокси (сервер прокси, логин, пароль), бывает нужно редко, обычно просто ставлю галку "Использовать прокси" и 1С сама подтягивает прокси по умолчанию.

Путь к самому rest-сервису, это все, что написано после домена верхнего уровня

Само тело запроса, может быть пустым, может содержать JSON запрос (как в примера), а может содержать XML или вообще base64 картинки/файла

Результат ответа — это тело ответа и код ответа с подробным описанием

Команды получения готово кода для конфигуратора

Пример получаемого кода

Если часть процедур/функций по работе с http вшиты в конфу, то генерится не универсальный код, а код с использованием процедур/функций конфы

Настройка заголовков запроса, это может контент тайп или ключ апи, как в примере

Параметры закидываются в/из строки сервиса

 

Данные формы — хитрая штука, с которыми 1С не позволяет работать как с объектом, при внесении этих параметров генерится особое тело запроса с разделителями и т.д. 

Использовал их всего один раз, перекрестился и забыл.

Визуализатор/конструктор JSON-объектов

Использую на 8.3.11.2899.

15 Comments

  1. Stepa86

    По картинке к статье подумал, что это конвертер строки curl в код 1С. Вот куча кнопочек, полей и прочего не так интересна, как такой конвертер, т.к. почти все примеры в интернетах написаны с использованием curl, например https://rocket.chat/docs/developer-guides/rest-api/chat/postmessage/#example-call

    Может кто-нить сделает? Звездочек огребет наверняка

    Reply
  2. leongl

    (1) Согласен, сам подумываю написать импорт/экспорт Curl и SoapUI

    Reply
  3. ilyav

    А зачем это в 1с? пользуюсь программой Postman https://www.getpostman.com/ на 100% устраивает

    Reply
  4. leongl

    (3)О, на это есть несколько причин — не везде разрешают стороннее по, поведение 1С все таки иное (все тот-же прокси, конвертация кириллицы в строке запроса), запуск на серве 1С, который является другой тачкой и другим юзером AD.

    Чем приближенней к реальным условиям эксплуатации, тем лучше. Да и после getpostman, cUrl, SoapUI придется все перетаскивать в код, а тут сгенерил код и огонь.

    Reply
  5. starik-2005

    Чета в этом есть, ибо можно прикрутить сюда тестирование нагрузки и все такое прочее, что есть в сторонних решениях. В итоге описал сервис, нажал «завалить в 1000 потоков», в итоге чето там протестировал (или повесил сервак) — все опыт. Сразу ясно, тянет 1С это или тут лучше астральный программист на питоне за 10 килорублей…

    Reply
  6. Vanch90

    (3) Как зачем удобство)

    Еще бы на обычных формах похожее)

    Reply
  7. kembrik

    Делал нечто подобное «для себя» но у автора пофункциональней. Я правда для вывода использовал «ФорматированныйДокумент» чтобы значения и атрибуты раскрашивать по-всякому, так глазастей. Так сказать, хотелось бы увидеть и у вас) Чтобы инструмент превратился в ультимативный

    Reply
  8. 🅵🅾️🆇

    Однозначно [★] в карму :3

    Reply
  9. s22

    Было бы хорошо генерировать защищеный post (исключение двойной отсылки)

    А так же более менее стандартный обмен по рестапи

    Reply
  10. shura_k

    Не хватало работы с Digest авторизацией. Доделал.

    На форму надо добавить два реквизита, а так все в коде.

    Вставлять контекстно.

     Если Digest и Результат.КодСостояния=401 Тогда
    WWW_Authenticate=Результат.Заголовки.Получить(«WWW-Authenticate»);
    Ответ=СтрРазделить(WWW_Authenticate,»,»);
    Если Ответ.Количество()>0 Тогда
    realm=ОтветЗначение(«realm»,Ответ[0]);
    HA1 = ПолучитьХеш(Логин+»:»+realm+»:»+Пароль);
    HA1=ХексВСтроку(HA1);
    URI=?(Лев(Сервис,1)<>»/»,»/»+Сервис,Сервис);
    HA2 = ПолучитьХеш(ВРег(ИмяМетода)+»:»+URI);
    HA2=ХексВСтроку(HA2);
    qop=ОтветЗначение(«qop»,Ответ[1]);
    nonce=ОтветЗначение(«nonce»,Ответ[2]);
    opaque=ОтветЗначение(«opaque»,Ответ[3]);
    nc=nc+1;
    ncStr=формат(nc,»ЧЦ=8; ЧДЦ=; ЧВН=; ЧГ=0″);
    cnonce=Новый УникальныйИдентификатор;
    cnonce=НРег(СтрЗаменить(Строка(cnonce), «-«, «»));
    Если НРег(Лев(qop,4))=»auth» Тогда
    Response  = ПолучитьХеш(HA1+»:»+nonce+»:»+ncStr+»:»+cnonce+»:»+qop+»:»+HA2);
    Иначе
    Response  = ПолучитьХеш(HA1+»:»+nonce+»:»+HA2);
    КонецЕсли;
    Response=ХексВСтроку(Response);
    
    DigestЗапрос=»Digest username=»»»+Логин+»»», realm=»»»+realm+»»», nonce=»»»+nonce;
    DigestЗапрос=DigestЗапрос+»»», uri=»»»+URI+»»», qop=»»»+qop+»»», nc=»»»+ncStr;
    DigestЗапрос=DigestЗапрос+»»», cnonce=»»»+cnonce+»»», response=»»»+Response+»»», opaque=»»»+opaque+»»»»;
    
    УдалитьАвторизацию();
    
    Стр=Заголовки.Добавить();
    Стр.ИмяЗаголовка=»Authorization»;
    Стр.ЗначениеЗаголовка=DigestЗапрос;
    
    ВыполнитьЗапросПоМетоду(ВРег(ИмяМетода));
    Возврат;
    КонецЕсли;
    
    КонецЕсли;
    
    
    
    &НаСервере
    Процедура УдалитьАвторизацию()
    
    
    Отбор = Новый Структура;
    Отбор.Вставить(«ИмяЗаголовка», «Authorization»);
    Строки = Заголовки.НайтиСтроки(Отбор);
    Если Строки.Количество()>0 Тогда
    Заголовки.Удалить(Строки[0]);
    КонецЕсли;
    
    КонецПроцедуры
    
    &НаСервереБезКонтекста
    Функция ПолучитьХеш(Текст)
    ОбъектХеш = Новый ХешированиеДанных(ХешФункция.MD5);
    ОбъектХеш.Добавить(Текст);
    Возврат ОбъектХеш.ХешСумма;
    КонецФункции
    
    &НаСервереБезКонтекста
    Функция ОтветЗначение(Ответ,Значение)
    результат=Сред(Значение,Найти(Значение,Ответ+»=»)+СтрДлина(Ответ)+2);
    результат=Лев(результат,СтрДлина(результат)-1);
    Возврат результат;
    КонецФункции
    
    &НаСервереБезКонтекста
    Функция ХексВСтроку(Текст)
    Возврат НРег(СтрЗаменить(Строка(Текст), » «, «»));
    КонецФункции
    
    

    Показать

    Reply
  11. swimdog
    Reply
  12. leemuar

    Попробовал вашу обработку, спасибо!

    Есть небольшое неудобство: обработка не выводит заголовки и тело ответа если код ответа не равен 200. Мне кажется было бы удобнее видеть заголовки и тело ответа всегда, при любом коде ответа.

    Reply
  13. dndw

    Про попытке добавления сервиса:

    {ВнешняяОбработка.ОтправитьHTTPЗапрос.Форма.Форма.Форма(558)}: Индекс находится за границами массива

    Рез.Сервер = Лев(МассивДанныхСсылки[1], Найти(МассивДанныхСсылки[1], «/»)-1);

    при попытке заполнить по cURL

    {ВнешняяОбработка.ОтправитьHTTPЗапрос.Форма.Форма.Форма(957)}: Индекс находится за границами массива

    ВремТекстТела = МассивСтрокТела[1];

    Reply
  14. Vida

    Подскажите пожалуйста на совместимости = 8.3.5 пойдет?

    Reply
  15. DVBLEX

    Кто может закинуть ето решения беслатно в пм ?

    Reply

Leave a Comment

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