Приклад роботи з 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); КінецьЯкщо; Результат = Новий Структура; Результат.Вставити("Схема", Схема); Результат.Вставити("Логін", Логін); Результат.Вставити("Пароль", Пароль); Результат.Вставити("Ім'яСервера", Ім'яСервера); Результат.Вставити("Хост", Хост); Результат.Вставити("Порт", ?(Порт <> "", Число(Порт), Невизначено)); Результат.Вставити("ШляхНаСервері", ШляхНаСервері); Повернення Результат; КінецьФункції