Заказы на доработку 1С (сервис удаленной работы)

Хранилище

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

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Работа с http-запросами (get и post) в языке 1С 8.3, 8.2 (в примерах)          
Vofka Подменю пользователя
сообщение 28.08.20, 9:17
Сообщение #1

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13948
Из: Киев
Спасибо сказали: 4514 раз
Рейтинг: 3635.6

/// Как получить страницу сайта через http-запрос
/// из 1с 8.3, 8.2

&НаКлиенте
Процедура КакПолучитьСтраницуСайтаЧерезHttpЗапросНаКлиенте()

    // В сети есть сайт http://example.com
    // Запросим содержимое его главной страницы.

    // Подключаемся к сайту.
    Соединение = Новый HTTPСоединение(
        "example.com", // сервер (хост)
        80, // порт, по умолчанию для http используется 80, для https 443
        , // пользователь для доступа к серверу (если он есть)
        , // пароль для доступа к серверу (если он есть)
        , // здесь указывается прокси, если он есть
        , // таймаут в секундах, 0 или пусто - не устанавливать
          // защищенное соединение, если используется https
    );

    // Получаем текст корневой страницы через GET-запрос.
    Запрос = Новый HTTPЗапрос("/");
    // Если бы нужна была другая страница, мы бы указали,
    // например, "/about" или "/news".

    Результат = Соединение.Получить(Запрос);

    Сообщить("Нам вернули код: " + Результат.КодСостояния);
    // Что примерно означают коды результата запроса:
    // [100, 299] - хороший код возврата
    // [300, 399] - нас перенаправляют на другую страницу,
    //              причём 302 - код постоянного перенаправления
    // [400, 499] - ошибка запроса
    // [500, 599] - ошибка сервера

    // в теле результата запроса - текст обычной html страницы
    Сообщить("Тело результата: " + Результат.ПолучитьТелоКакСтроку());  

КонецПроцедуры

/// Как обработать перенаправление в http-запросе
/// из 1с 8.3, 8.2

&НаКлиенте
Процедура КакОбработатьПеренаправлениеВHttpЗапросеНаКлиенте()

    // Предположим, что мы хотим отправить поисковый http запрос
    // гуглу и получить от него страницу с результатами нашего
    // запроса.

    // К примеру, будем искать по строке "работа программистом 1с в моём городе".

    Соединение = Новый HTTPСоединение("www.google.com", 80);

    Запрос = Новый HTTPЗапрос("/search?q=работа программистом 1с в моём городе");
    Результат = Соединение.Получить(Запрос);

    Сообщить("Нам вернули код " + Результат.КодСостояния);

    Если Результат.КодСостояния = 302 Тогда
        Сообщить("Нас перенаправили на другую страницу.");
        Сообщить("Адрес этой страницы находится в заголовке результата Location.");
        Сообщить("Вот он: " + Результат.Заголовки.Получить("Location"));

        // Воспользуемся вспомогательной функцией СтруктураURI, которая
        // сама вытаскивает из адреса имя хоста, порт и путь к ресурсу.

        URI = СтруктураURI(Результат.Заголовки.Получить("Location"));

        // Делаем новое подключение и get запрос.

        Соединение = Новый HTTPСоединение(URI.Хост, URI.Порт);
        Запрос = Новый HTTPЗапрос(URI.ПутьНаСервере);
        Результат =  Соединение.Получить(Запрос);

        Сообщить("Нам вернули код " + Результат.КодСостояния);

        // Сохраним тело ответа (это и есть наша страница с результатами
        // поиска) в виде htm файла и тут же покажем его пользователю.

        КаталогДляЭкспериментов = КаталогДокументов() + "\helpme1c.ru";
        СоздатьКаталог(КаталогДляЭкспериментов);
        ФайлРезультатов = КаталогДляЭкспериментов + "\test.htm";

        Текст = Новый ЗаписьТекста(ФайлРезультатов, КодировкаТекста.UTF8);
        Текст.Записать(Результат.ПолучитьТелоКакСтроку());
        Текст.Закрыть();

        Сообщить("Результаты поиска сохранены в " + ФайлРезультатов);

        ЗапуститьПриложение(ФайлРезультатов);
    КонецЕсли;

КонецПроцедуры

/// Как сохранить картинку с сайта через http-запрос
/// из 1с 8.3, 8.2

&НаКлиенте
Процедура КакСохранитьКартинкуСайтаЧерезHttpЗапросНаКлиенте()

    // Запрашивать через http можно не только html-страницы,
    // но и другие объекты, доступные нам через http,
    // например, картинки.

    // Сохраним на диск и покажем пользователю картинку, которая
    // размещена в интернете по адресу:
    // thumb7.shutterstock.com/display_pic_with_logo/1014806/270790184/
    // stock-photo-summer-holidays-background-sea-background-270790184.jpg

    Соединение = Новый HTTPСоединение("thumb7.shutterstock.com", 80);

    // Get-запрос к ресурсу на сервере.
    Запрос = Новый HTTPЗапрос("/display_pic_with_logo/1014806/270790184/" +
        "stock-photo-summer-holidays-background-sea-background-270790184.jpg");
    Результат = Соединение.Получить(Запрос);

    Сообщить("Нам вернули код " + Результат.КодСостояния);

    // Сама картинка - уже в теле ответа, осталось
    // только записать её в файл на диск в виде двоичных данных.

    КаталогДляЭкспериментов = КаталогДокументов() + "\helpme1c.ru";
    СоздатьКаталог(КаталогДляЭкспериментов);
    ФайлКартинки = КаталогДляЭкспериментов + "\test.jpg";

    // Записываем картинку на диск.
    Результат.ПолучитьТелоКакДвоичныеДанные().Записать(ФайлКартинки);

    Сообщить("Сохранили картинку по адресу " + ФайлКартинки);

    // Покажем картинку пользователю.
    ЗапуститьПриложение(ФайлКартинки);    

КонецПроцедуры

/// Как послать защищенный https запрос к серверу из 1с 8.3, 8.2

&НаКлиенте
Процедура КакПослатьЗащищенныйHttpsЗапросКСерверуНаКлиенте()

    // Получим код страницы https://ya.ru
    // Так как для доступа к ней используется защищенный
    // протокол https - нам нужно заполнить последний
    // параметр при соединении с сервером.

    Соединение = Новый HTTPСоединение(
        "ya.ru", // сервер (хост)
        443, // порт, по умолчанию для http используется 80, для https 443
        , // пользователь для доступа к серверу (если он есть)
        , // пароль для доступа к серверу (если он есть)
        , // здесь указывается прокси, если он есть
        , // таймаут в секундах, 0 или пусто - не устанавливать
       Новый ЗащищенноеСоединениеOpenSSL()
    );

    // Получаем текст корневой страницы через GET-запрос.
    Запрос = Новый HTTPЗапрос("/");
    // Если бы нужна была другая страница, мы бы указали,
    // например, "/about" или "/news".

    Результат = Соединение.Получить(Запрос);
    Сообщить(Результат.КодСостояния);
    Сообщить(Результат.ПолучитьТелоКакСтроку());

КонецПроцедуры

/// Как установить заголовки http-запроса из 1с 8.3, 8.2

&НаКлиенте
Процедура КакУстановитьЗаголовкиHttpЗапросаНаКлиенте()

   // Возьмём чисто гипотетический пример.

   // Нам нужно послать запрос к http://example.com/,
   // передав ему в куках (cookie) session=231.
   // Также мы будем передадим в запросе поле keep-alive,
   // чтобы сервер не закрывал наше соединений к нему
   // для повторых запросов.

   // За всё это отвечают заголовки запроса.

   Заголовки = Новый Соответствие;
   Заголовки.Вставить("Cookie", "session=231");
   Заголовки.Вставить("Connection", "keep-alive");

    // Подключаемся к сайту.
    Соединение = Новый HTTPСоединение("example.com");

    // Получаем текст корневой страницы через GET-запрос.
    Запрос = Новый HTTPЗапрос("/", Заголовки);
    // Если бы нужна была другая страница, мы бы указали,
    // например, "/about" или "/news".

    Результат = Соединение.Получить(Запрос);

КонецПроцедуры

/// Как указать прокси для http-запроса из 1с 8.3, 8.2

&НаКлиенте
Процедура КакУказатьПроксиДляHttpЗапросаНаКлиенте()

   // Если для соединения с интернетом используется прокси,
   // его нужно указывать так.

    ПроксиСервер = Новый ИнтернетПрокси;
    // авторизация
    ПроксиСервер.Пользователь = "Vova";
    ПроксиСервер.Пароль = "123";
    // прокси сервер прописывается для каждого протокола отдельно
    ПроксиСервер.Установить("http", "192.168.0.1", "8080");
    ПроксиСервер.Установить("https", "192.168.0.1", "6547");

    // Созданный объект указываем при http соединении.

    Соединение = Новый HTTPСоединение("example.com",,,, ПроксиСервер);

КонецПроцедуры

/// Как послать post-запрос через http из 1с 8.3, 8.2

&НаКлиенте
Процедура КакПослатьPostЗапросНаКлиенте()

    // Post-запрос отличается от Get-запроса только наличием
    // тела запроса.

    // То есть этот тот же самый HTTPЗапрос, но у которого
    // вызыван метод УстановитьТелоИзСтроки.
    // И это тело уже может быть и просто текстом, и текстом
    // в формате xml, json, soap и так далее.

    // В качестве большого примера рассмотрим фрагмент
    // авторизации на сайте 1с, там используются и get
    // и post запросы.

    // Откуда мы узнали как и когда посылать какие запросы?
    // Мы подсмотрели их у браузера (в Хроме нажмите F12, вкладка Network),
    // а также использовали беплатный инструмент Fiddler
    // для отладки и мониторинга http запросов.

    // Если бы мы писали рабочий код - нам понадобилось
    // всего несколько соединений с сервером, которые
    // мы бы не закрывали. Но в учебных целях будем
    // писать максимально просто ("тупо").

    // 1. Первым делом - посылаем get-запрос к
    // https://releases.1c.ru/total

    Соединение = Новый HTTPСоединение("releases.1c.ru",,,,,,
        Новый ЗащищенноеСоединениеOpenSSL());        
    Запрос = Новый HTTPЗапрос("/total");
    Результат = Соединение.Получить(Запрос);

    // В куках нам должны вернуть идентификатор сессии.
    Куки = Результат.Заголовки.Получить("Set-Cookie");
    // Он идёт первым параметром и отделён от остальных
    // частей точкой с запятой.
    Куки = СтрЗаменить(Куки, ";", Символы.ПС);
    ИдентификаторСессии1 = СтрПолучитьСтроку(Куки, 1);    

    Сообщить(ИдентификаторСессии1);

    // 2. В результате первого запроса нас перенаправили
    // на другую страницу, перейдём на неё новым get-запросом.
    Перенаправление = Результат.Заголовки.Получить("Location");

    Сообщить("Код возврата " + Результат.КодСостояния);
    Сообщить("Нас перенаправили на " + Перенаправление);

    // При помощи служебной функции СтруктураURI разберём
    // новый адрес на части.

    URI = СтруктураURI(Перенаправление);

    Соединение = Новый HTTPСоединение(URI.Хост, URI.Порт,,,,,
        Новый ЗащищенноеСоединениеOpenSSL());
    Запрос = Новый HTTPЗапрос(URI.ПутьНаСервере);    
    Результат =  Соединение.Получить(Запрос);

    // В куках нам вернули второй идентификатор.
    Куки = Результат.Заголовки.Получить("Set-Cookie");
    Куки = СтрЗаменить(Куки, ";", Символы.ПС);
    ИдентификаторСессии2 = СтрПолучитьСтроку(Куки, 1);

    Сообщить(ИдентификаторСессии2);    

    // 3. В результате предыдущего Get-запроса в теле нам вернули
    // страницу авторизации, вытащим из формы авторизации значения
    // параметров name="lt", name="execution" и name="_eventId",
    // чтобы затем сформировать код приглашения на сайт.

    ltValue = "";
    executionValue = "";
    _eventIdValue = "";

    Текст = Новый ТекстовыйДокумент;
    Текст.УстановитьТекст(Результат.ПолучитьТелоКакСтроку());
    Для Индекс = 0 По Текст.КоличествоСтрок() Цикл
        Строка = Текст.ПолучитьСТроку(Индекс);
        Если Найти(Строка, "name=""lt""") > 0 Тогда
            ltValue = ВытащитьЗначениеИзСтроки(Строка);
        ИначеЕсли Найти(Строка, "name=""execution""") > 0 Тогда
            executionValue = ВытащитьЗначениеИзСтроки(Строка);
        ИначеЕсли Найти(Строка, "name=""_eventId""") > 0 Тогда
            _eventIdValue = ВытащитьЗначениеИзСтроки(Строка);
        КонецЕсли;
    КонецЦикла;

    Сообщить(ltValue);
    Сообщить(executionValue);
    Сообщить(_eventIdValue);    

    // Для формирования кода приглашения нам понадобится
    // наш логин и пароль от ИТС.    

    ЛогинИТС = "";
    ПарольИТС = "";

    Если ЛогинИТС = "" Или ПарольИТС = "" Тогда
        Сообщить("Для продолжения укажите в коде логин и пароль от ИТС.");
        Возврат;
    КонецЕсли;

    КодПриглашения = "inviteCode=" +
        "&lt=" + ltValue +
        "&execution=" + executionValue +
        "&_eventId=" + _eventIdValue +
        "&username=" + ЛогинИТС +
        "&password=" + ПарольИТС;    

    // 4. Наконец, посылаем Post-запрос, вкладывая в тело запроса
    // код приглашения, а куках указыаем второй идентификатор сессии.    

    Ресурс =
        "/login;" +
        ИдентификаторСессии2 +
        "?service=https%3A%2F%2Fusers.v8.1c.ru%2Fdistribution%2Fpublic%2Fsecurity_check%3B" +
        ИдентификаторСессии1;

    Соединение = Новый HTTPСоединение("login.1c.ru",,,,,,
        Новый ЗащищенноеСоединениеOpenSSL());

    Заголовки = Новый Соответствие;    
    Заголовки.Вставить("Cookie", ИдентификаторСессии2);
    Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded;");    

    Запрос = Новый HTTPЗапрос(Ресурс, Заголовки);
    Запрос.УстановитьТелоИзСтроки(КодПриглашения);

    Результат = Соединение.ОтправитьДляОбработки(Запрос);

    Сообщить("Нам вернули код " + Результат.КодСостояния);
    Перенаправление = Результат.Заголовки.Получить("Location");
    Сообщить("И перенаправили на " + Перенаправление);

    // 5. В завершении авторизации переходим на следующую
    // страницу, используя первый идентификатор сессии.

    URI = СтруктураURI(Перенаправление);

    Соединение = Новый HTTPСоединение(URI.Хост, URI.Порт,,,,,
        Новый ЗащищенноеСоединениеOpenSSL());

    Заголовки = Новый Соответствие;    
    Заголовки.Вставить("Cookie", ИдентификаторСессии1);    

    Запрос = Новый HTTPЗапрос(URI.ПутьНаСервере, Заголовки);
    Результат =  Соединение.Получить(Запрос);    

    Сообщить("Нам вернули " + Результат.КодСостояния);
    Перенаправление = Результат.Заголовки.Получить("Location");
    Сообщить("И окончательно перенаправили на " + Перенаправление);        

    // Авторизация окончена, теперь можем запрашивать любые
    // страницы сайта, используя первый идентификатор сессии.

КонецПроцедуры

&НаКлиенте
Функция СтруктураURI(Знач СтрокаURI) Экспорт

    СтрокаURI = СокрЛП(СтрокаURI);

    // схема
    Схема = "";
    Позиция = Найти(СтрокаURI, "://");
    Если Позиция > 0 Тогда
        Схема = НРег(Лев(СтрокаURI, Позиция - 1));
        СтрокаURI = Сред(СтрокаURI, Позиция + 3);
    КонецЕсли;

    // строка соединения и путь на сервере
    СтрокаСоединения = СтрокаURI;
    ПутьНаСервере = "";
    Позиция = Найти(СтрокаСоединения, "/");
    Если Позиция > 0 Тогда
        ПутьНаСервере = Сред(СтрокаСоединения, Позиция + 1);
        СтрокаСоединения = Лев(СтрокаСоединения, Позиция - 1);
    КонецЕсли;

    // информация пользователя и имя сервера
    СтрокаАвторизации = "";
    ИмяСервера = СтрокаСоединения;
    Позиция = Найти(СтрокаСоединения, "@");
    Если Позиция > 0 Тогда
        СтрокаАвторизации = Лев(СтрокаСоединения, Позиция - 1);
        ИмяСервера = Сред(СтрокаСоединения, Позиция + 1);
    КонецЕсли;

    // логин и пароль
    Логин = СтрокаАвторизации;
    Пароль = "";
    Позиция = Найти(СтрокаАвторизации, ":");
    Если Позиция > 0 Тогда
        Логин = Лев(СтрокаАвторизации, Позиция - 1);
        Пароль = Сред(СтрокаАвторизации, Позиция + 1);
    КонецЕсли;

    // хост и порт
    Хост = ИмяСервера;
    Порт = "";
    Позиция = Найти(ИмяСервера, ":");
    Если Позиция > 0 Тогда
        Хост = Лев(ИмяСервера, Позиция - 1);
        Порт = Сред(ИмяСервера, Позиция + 1);
    КонецЕсли;

    Результат = Новый Структура;
    Результат.Вставить("Схема", Схема);
    Результат.Вставить("Логин", Логин);
    Результат.Вставить("Пароль", Пароль);
    Результат.Вставить("ИмяСервера", ИмяСервера);
    Результат.Вставить("Хост", Хост);
    Результат.Вставить("Порт", ?(Порт <> "", Число(Порт), Неопределено));
    Результат.Вставить("ПутьНаСервере", ПутьНаСервере);

    Возврат Результат;

КонецФункции

&НаКлиенте
Функция ВытащитьЗначениеИзСтроки(Строка)

    Позиция2 = СтрДлина(Строка);
    Пока Позиция2 > 1 Цикл
        Если Сред(Строка, Позиция2, 1) = """" Тогда
            Прервать;
        КонецЕсли;
        Позиция2 = Позиция2 - 1;
    КонецЦикла;

    Позиция1 = Позиция2 - 1;
    Пока Позиция1 > 1 Цикл
        Если Сред(Строка, Позиция1, 1) = """" Тогда
            Прервать;
        КонецЕсли;
        Позиция1 = Позиция1 - 1;
    КонецЦикла;

    Возврат Сред(Строка, Позиция1 + 1, Позиция2 - Позиция1 - 1);

КонецФункции


[необходимо зарегистрироваться для просмотра ссылки]

chernomoretc_cn Подменю пользователя
сообщение 18.12.21, 20:21
Сообщение #2

Общительный
**
Группа: Пользователи
Сообщений: 14
Спасибо сказали: 0 раз
Рейтинг: 0

Vofka @ 28.08.20, 9:17 * ,
Есть такая инструкция по отправке количества товаров
curl --location -g --request POST 'https://{{domain}}/api/stock/9518/quantity/' \
--header 'APIKEY: {{api_key}}' \
--data-raw '{
"quantity": {
"0": {
"stock_id": 1,
"quantity": 6
},
"1": {
"stock_id": 2,
"quantity": 7
}
}
}
В 1с Делаю следующее
ТелоЗапроса = "{""quantity"": {""1"":{""stock_id"": 2,""quantity"": 2}}}";
Заголовки = Новый Соответствие();
Заголовки.Вставить("APIKEY", "заданный Ключ");

HTTPСоединение = Новый HTTPСоединение("crm.solarmarket.com.ua");
HTTPЗапрос = Новый HTTPЗапрос("/api/stock/7936/quantity/" +ТелоЗапроса ,Заголовки); //7936 это stock
HTTPОтвет = HTTPСоединение.Получить(HTTPЗапрос);
КодСостояния = HTTPОтвет.КодСостояния;

HTTPОтвет- 400
Подскажите, что я делаю не правильно.

Vofka Подменю пользователя
сообщение 19.12.21, 15:50
Сообщение #3

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13948
Из: Киев
Спасибо сказали: 4514 раз
Рейтинг: 3635.6

Цитата(chernomoretc_cn @ 18.12.21, 20:21) *
HTTPОтвет = HTTPСоединение.Получить(HTTPЗапрос);

Это GET запрос. POST делается так:
HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 29.03.24, 15:54
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!