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

Публикация № 835540

Программирование - Инструментарий

Консоль http-запрос rest post get

161
Консоль 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.

161

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

Наименование Файл Версия Размер
Консоль HTTP-запросов с генерацией кода:
.epf 21,00Kb
25.05.18
197
.epf 1.1.3 21,00Kb 197 Скачать

См. также

Специальные предложения

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

Может кто-нить сделает? Звездочек огребет наверняка
2. leongl 193 25.05.18 11:51 Сейчас в теме
(1) Согласен, сам подумываю написать импорт/экспорт Curl и SoapUI
3. ilyav 25.05.18 15:24 Сейчас в теме
А зачем это в 1с? пользуюсь программой Postman https://www.getpostman.com/ на 100% устраивает
adhocprog; Mortum; fr13; bpc222; +4 Ответить
4. leongl 193 25.05.18 15:59 Сейчас в теме
(3)О, на это есть несколько причин - не везде разрешают стороннее по, поведение 1С все таки иное (все тот-же прокси, конвертация кириллицы в строке запроса), запуск на серве 1С, который является другой тачкой и другим юзером AD.
Чем приближенней к реальным условиям эксплуатации, тем лучше. Да и после getpostman, cUrl, SoapUI придется все перетаскивать в код, а тут сгенерил код и огонь.
frkbvfnjh; adhocprog; 🅵🅾️🆇; jaroslav.h; vaskomain; JohnyDeath; blackhole321; CyberCerber; van_za; +9 Ответить
7. Vanch90 28.05.18 07:34 Сейчас в теме
(3) Как зачем удобство)
Еще бы на обычных формах похожее)
jaroslav.h; +1 Ответить
5. starik-2005 1842 26.05.18 11:07 Сейчас в теме
Чета в этом есть, ибо можно прикрутить сюда тестирование нагрузки и все такое прочее, что есть в сторонних решениях. В итоге описал сервис, нажал "завалить в 1000 потоков", в итоге чето там протестировал (или повесил сервак) - все опыт. Сразу ясно, тянет 1С это или тут лучше астральный программист на питоне за 10 килорублей...
8. kembrik 2 28.05.18 19:00 Сейчас в теме
Делал нечто подобное "для себя" но у автора пофункциональней. Я правда для вывода использовал "ФорматированныйДокумент" чтобы значения и атрибуты раскрашивать по-всякому, так глазастей. Так сказать, хотелось бы увидеть и у вас) Чтобы инструмент превратился в ультимативный
Прикрепленные файлы:
10. 🅵🅾️🆇 30.05.18 17:13 Сейчас в теме
Однозначно [★] в карму :3
11. s22 20 06.07.18 17:45 Сейчас в теме
Было бы хорошо генерировать защищеный post (исключение двойной отсылки)
А так же более менее стандартный обмен по рестапи
12. shura_k 10.07.18 18:34 Сейчас в теме
Не хватало работы с 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);
	Возврат результат;
КонецФункции

&НаСервереБезКонтекста
Функция ХексВСтроку(Текст)
	 Возврат НРег(СтрЗаменить(Строка(Текст), " ", ""));
КонецФункции
 
Показать
Vida; swimdog; eeeio; +3 Ответить
13. swimdog 613 11.01.19 14:29 Сейчас в теме
(12) Переделал под универсальное получение Digest, если предыдущее значение вернуло ошибку аутентификации

	// Выполнить GET запрос:
	Попытка
		Результат = Соединение.Получить(HTTPЗапрос, ФайлРезультат);
	Исключение
		ПоказатьПредупреждение(Новый ОписаниеОповещения(), "Не удалось получить фото, проверьте параметры запроса!" + Символы.ВК + Символы.ВК + ОписаниеОшибки(), , "Получение фото автомобиля");
	КонецПопытки;
	
	Если Результат.КодСостояния = 200 Тогда
		
		ФотоМашины = Новый Картинка(ФайлРезультат, Истина);
		АдресФото = ПоместитьВоВременноеХранилище(ФотоМашины);
		
	ИначеЕсли Результат.КодСостояния = 401 Тогда
		
		WWW_Authenticate=Результат.Заголовки.Получить("WWW-Authenticate");
		ИмяМетода = "GET";
		Сервис = АдресРесурса;
		nc = 0;
		
		Ответ=СтрРазделить(СтрЗаменить(WWW_Authenticate, "Digest ", ""), ",");
		Если Ответ.Количество()>0 Тогда
			realm = ОтветЗначение("realm", Ответ);
			HA1 = ПолучитьХеш(Логин+":"+realm+":"+Пароль);    
			HA1 = ХексВСтроку(HA1);
			URI = ?(Лев(Сервис,1)<>"/","/"+Сервис, Сервис);
			HA2 = ПолучитьХеш(ВРег(ИмяМетода)+":"+URI);
			HA2 = ХексВСтроку(HA2);
			qop = ОтветЗначение("qop", Ответ);
			nonce = ОтветЗначение("nonce", Ответ);
			opaque = ОтветЗначение("opaque", Ответ);
			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+"""";
			
			HTTPЗапрос.Заголовки.Вставить("Authorization", DigestЗапрос);
			
			Попытка
				Результат = Соединение.Получить(HTTPЗапрос, ФайлРезультат);
			Исключение
				ПоказатьПредупреждение(Новый ОписаниеОповещения(), "Не удалось получить фото, проверьте параметры запроса!" + Символы.ВК + Символы.ВК + ОписаниеОшибки(), , "Получение фото автомобиля");
				Возврат;
			КонецПопытки;
			
			Если Результат.КодСостояния = 200 Тогда
				ФотоМашины = Новый Картинка(ФайлРезультат, Истина);
				АдресФото = ПоместитьВоВременноеХранилище(ФотоМашины);
			Иначе
				ПоказатьПредупреждение(Новый ОписаниеОповещения(), "Не удалось получить фото, проверьте параметры запроса!" + Символы.ВК + Символы.ВК + "Код результата = " + Результат.КодСостояния, , "Получение фото автомобиля");
			КонецЕсли;
			
		КонецЕсли; 
		
	КонецЕсли; 
	
	
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПолучитьХеш(Текст)
	ОбъектХеш = Новый ХешированиеДанных(ХешФункция.MD5);
	ОбъектХеш.Добавить(Текст);
	
	Возврат ОбъектХеш.ХешСумма;
КонецФункции

&НаСервереБезКонтекста
Функция ОтветЗначение(Значение, Ответ)
	результат = "";
	Для каждого СтрокаОтвета Из Ответ Цикл
		Если Найти(СтрокаОтвета, Значение) Тогда
			результат=Сред(СтрокаОтвета, Найти(СтрокаОтвета, "=")+2);
			результат=Лев(результат,СтрДлина(результат)-1);
		КонецЕсли;
	КонецЦикла;
	
	Возврат результат;
КонецФункции

&НаСервереБезКонтекста
Функция ХексВСтроку(Текст)
	
	Возврат НРег(СтрЗаменить(Строка(Текст), " ", ""));
	
КонецФункции
Показать
14. leemuar 18.01.19 11:45 Сейчас в теме
Попробовал вашу обработку, спасибо!

Есть небольшое неудобство: обработка не выводит заголовки и тело ответа если код ответа не равен 200. Мне кажется было бы удобнее видеть заголовки и тело ответа всегда, при любом коде ответа.
15. dndw 6 13.03.19 15:52 Сейчас в теме
Про попытке добавления сервиса:

{ВнешняяОбработка.ОтправитьHTTPЗапрос.Форма.Форма.Форма(558)}: Индекс находится за границами массива
Рез.Сервер = Лев(МассивДанныхСсылки[1], Найти(МассивДанныхСсылки[1], "/")-1);

при попытке заполнить по cURL
{ВнешняяОбработка.ОтправитьHTTPЗапрос.Форма.Форма.Форма(957)}: Индекс находится за границами массива
ВремТекстТела = МассивСтрокТела[1];
16. Vida 10 13.05.19 18:06 Сейчас в теме
Подскажите пожалуйста на совместимости = 8.3.5 пойдет?
Оставьте свое сообщение