Довідковий матеріал

Приклад роботи з HTTPЗ'єднанням

Приклад демонструє обробку кодів стану, які може повернути HTTP-сервер. Окремо обробляються помилки запиту, помилки сервера та перенаправлення на нову URL-адресу.

Приклад демонструє обробку кодів стану, які може повернути HTTP-сервер. Окремо обробляються помилки запиту, помилки сервера та перенаправлення на нову URL-адресу.

Для роботи прикладу потрібна платформа "1С:Підприємство" версії 8.2.18 і вище або 8.3.3 і вище.

&НаКлієнті
Процедура ВиконатиЗапит(Команда)
	ВиконатиHTTPЗапит("http://example.com");
КінецьПроцедури 

&НаКлієнті 
Процедура ВиконатиHTTPЗапит(ПовнаАдресаРесурсу)
	СтруктураURI = СтруктураURI(ПовнаАдресаРесурсу);
	HTTPЗ'єднання = Новий HTTPЗ'єднання(СтруктураURI.Хост, СтруктураURI.Порт);
	HTTPЗапит = Новий HTTPЗапит(СтруктураURI.ШляхНаСервері);
	Спроба  
		Результат =  HTTPЗ'єднання.Отримати(HTTPЗапит);
	Виняток     
		// виняток тут говорить про те, що запит не дійшов до HTTP-Сервера    
		Повідомити("Сталася мережева помилка!");
		ВикликатиВиняток;
	КінецьСпроби;
	// Аналізуємо фатальні помилки  
	// У більшості випадків потрібно зупинити роботу та показати користувачу повідомлення про помилку, 
	// включивши до нього HTTP-статус     
	// Помилки 4XX говорять про неправильний запит — у широкому сенсі   
	// Може бути неправильна адреса, помилка автентифікації, поганий формат запиту   
	// Докладніше дивись http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4 
	Якщо Результат.КодСтану >= 400 і Результат.КодСтану < 500  Тоді
		Повідомити("Код статусу більше 4XX, помилка запиту.  Код статусу: " + Результат.КодСтану);
	КінецьЯкщо;
	// Помилки 5XX говорять про проблеми на сервері (можливо, проксі-сервер)
	// Це може бути програмна помилка, нестача пам'яті, помилка конфігурації тощо.
	// Докладніше дивись http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.5  
	Якщо Результат.КодСтану >= 500 і Результат.КодСтану <600  Тоді
		Повідомити("Код статусу більше 5XX, помилка сервера. Код статусу: " + Результат.КодСтану);
	КінецьЯкщо;
	// Обробляємо перенаправлення    
	Якщо Результат.КодСтану >= 300 і Результат.КодСтану < 400  Тоді
		Повідомити("Код статусу більше 3XX, Перенаправлення. Код статусу: " + Результат.КодСтану);
		Якщо Результат.КодСтану = 302 Тоді
			Повідомити("Код статусу 302, Постійне перенаправлення.");
			АдресаРесурсу = Результат.Заголовки.Отримати("Location");
			Якщо АдресаРесурсу <>	Невизначено Тоді
				Повідомити("Виконую запит за новою адресою " + АдресаРесурсу);
				ВиконатиHTTPЗапит(АдресаРесурсу);
			Інакше                  
				Повідомити("Сервер не повідомив адресу ресурсу!");
			КінецьЯкщо;
		КінецьЯкщо;
	КінецьЯкщо;
	// Статуси 1XX і 2XX вважаємо добрими     
	Якщо Результат.КодСтану < 300 Тоді
		Повідомити("Найімовірніше, все добре");
		Повідомити("Код статусу: " + Результат.КодСтану);
	КінецьЯкщо;
КінецьПроцедури  

&НаКлієнті 
Функція СтруктураURI(Знач РядокURI) Експорт
	РядокURI = СкорЛП(РядокURI);
	// схема  
	Схема = "";
	Позиція = Знайти(РядокURI, "://");
	Якщо Позиція >0 Тоді
		Схема = НРег(Лів(РядокURI, Позиція - 1));
		РядокURI = Сер(РядокURI, Позиція + 3);
	КінецьЯкщо;
	// рядок з'єднання та шлях на сервері
	РядокЗ'єднання = РядокURI;
	ШляхНаСервері = "";
	Позиція = Знайти(РядокЗ'єднання, "/");
	Якщо Позиція >0 Тоді
		ШляхНаСервері = Сер(РядокЗ'єднання, Позиція + 1);
		РядокЗ'єднання = Лів(РядокЗ'єднання, Позиція - 1);
	КінецьЯкщо;
	// інформація користувача та ім'я сервера  
	РядокАвторизації = "";
	Ім'яСервера = РядокЗ'єднання;
	Позиція = Знайти(РядокЗ'єднання, "@");
	Якщо Позиція >0 Тоді
		РядокАвторизації = Лів(РядокЗ'єднання, Позиція - 1);
		Ім'яСервера = Сер(РядокЗ'єднання, Позиція + 1);
	КінецьЯкщо;
	// логін і пароль  
	Логін = РядокАвторизації;
	Пароль = "";
	Позиція = Знайти(РядокАвторизації, ":");
	Якщо Позиція >0 Тоді
		Логін = Лів(РядокАвторизації, Позиція - 1);
		Пароль = Сер(РядокАвторизації, Позиція + 1);
	КінецьЯкщо;
	// хост і порт  
	Хост = Ім'яСервера;
	Порт = "";
	Позиція = Знайти(Ім'яСервера, ":");
	Якщо Позиція >0 Тоді
		Хост = Лів(Ім'яСервера, Позиція - 1);
		Порт = Сер(Ім'яСервера, Позиція + 1);
	КінецьЯкщо;
	Результат = Новий Структура;
	Результат.Вставити("Схема", Схема);
	Результат.Вставити("Логін", Логін);
	Результат.Вставити("Пароль", Пароль);
	Результат.Вставити("Ім'яСервера", Ім'яСервера);
	Результат.Вставити("Хост", Хост);
	Результат.Вставити("Порт", ?(Порт <> "", Число(Порт), Невизначено));
	Результат.Вставити("ШляхНаСервері", ШляхНаСервері);
	Повернення Результат;
КінецьФункції
Записатися телефоном