// AdrestoКлиент — общий модуль для стандартизации адресов Узбекистана. // // Установка: создайте Общий модуль «AdrestoКлиент» (галка «Сервер», «Вызов // сервера»), вставьте код. Секретный ключ храните в константе/защищённом // хранилище, НЕ в клиентском коде. // // Использование: // Рез = AdrestoКлиент.СтандартизоватьАдрес("Ташкент, Амир Темур 107"); // Сообщить(Рез.value); // город Ташкент, улица Amir Temur, д. 107 // Сообщить(Рез.data.postal_code); // 100000 Функция БазовыйУРЛ() Экспорт Возврат "https://adresto.uz"; // без завершающего слэша КонецФункции Функция ПубличныйКлюч() Возврат "ВАШ_ПУБЛИЧНЫЙ_КЛЮЧ"; КонецФункции Функция СекретныйКлюч() // В проде — из константы/безопасного хранилища, а не строкой в коде. Возврат Константы.AdrestoСекрет.Получить(); КонецФункции // Внутреннее: POST JSON и разбор ответа. Функция ВыполнитьЗапрос(Путь, ТелоСтруктура, ТребуетсяСекрет = Ложь) URLСтруктура = РазобратьURL(БазовыйУРЛ()); Защищённое = Новый ЗащищённоеСоединениеOpenSSL(); Соединение = Новый HTTPСоединение(URLСтруктура.Хост, URLСтруктура.Порт, , , , 30, Защищённое); Заголовки = Новый Соответствие; Заголовки.Вставить("Content-Type", "application/json"); Заголовки.Вставить("Authorization", "Token " + ПубличныйКлюч()); Если ТребуетсяСекрет Тогда Заголовки.Вставить("X-Secret", СекретныйКлюч()); КонецЕсли; ЗаписьJSON = Новый ЗаписьJSON; ЗаписьJSON.УстановитьСтроку(); ЗаписатьJSON(ЗаписьJSON, ТелоСтруктура); ТелоСтроки = ЗаписьJSON.Закрыть(); Запрос = Новый HTTPЗапрос(URLСтруктура.Путь + Путь, Заголовки); Запрос.УстановитьТелоИзСтроки(ТелоСтроки, КодировкаТекста.UTF8); Ответ = Соединение.ОтправитьДляОбработки(Запрос); Если Ответ.КодСостояния >= 300 Тогда ВызватьИсключение "Adresto HTTP " + Ответ.КодСостояния + ": " + Ответ.ПолучитьТелоКакСтроку(); КонецЕсли; ЧтениеJSON = Новый ЧтениеJSON; ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку()); Результат = ПрочитатьJSON(ЧтениеJSON); ЧтениеJSON.Закрыть(); Возврат Результат; КонецФункции // Стандартизация одного адреса. Возвращает первый результат (Структура). Функция СтандартизоватьАдрес(Адрес) Экспорт Тело = Новый Структура("addresses", Новый Массив); Тело.addresses.Добавить(Адрес); Ответ = ВыполнитьЗапрос("/api/v1/clean/address", Тело, Истина); Если Ответ.results.Количество() > 0 Тогда Возврат Ответ.results[0]; КонецЕсли; Возврат Неопределено; КонецФункции // Пакетная стандартизация (до размера пакета вашего тарифа). Массив адресов // -> массив результатов. Функция СтандартизоватьПакет(МассивАдресов) Экспорт Тело = Новый Структура("addresses", МассивАдресов); Возврат ВыполнитьЗапрос("/api/v1/clean/address", Тело, Истина).results; КонецФункции // Подсказки при вводе (публичный ключ). Возвращает массив вариантов. Функция Подсказки(Запрос, Количество = 7) Экспорт Тело = Новый Структура("query, count", Запрос, Количество); Возврат ВыполнитьЗапрос("/api/v1/suggest/address", Тело, Ложь).suggestions; КонецФункции // Разбор URL на хост/порт/путь. Функция РазобратьURL(URL) Стр = СтрЗаменить(URL, "https://", ""); Порт = 443; Хост = Стр; Путь = ""; Поз = СтрНайти(Стр, "/"); Если Поз > 0 Тогда Хост = Лев(Стр, Поз - 1); Путь = Сред(Стр, Поз); КонецЕсли; Возврат Новый Структура("Хост, Порт, Путь", Хост, Порт, Путь); КонецФункции