Выполнение POST-запроса на примере Yandex.API
Выполнение GET-запроса на примере Яндекс.API
Выполнение POST-запроса по протоколу HTTPS на платформе 8.2 на примере Yandex.API
Выполнение POST-запроса по протоколу HTTPS на платформе 8.2 на примере Yandex.API
Платформа 1С поддерживает выполнение HTTP-запросов методом POST. POST-запрос позволяет передать на веб-сервер большой объем данных, в отличии от GET-запроса, например, файл или строку большой длины. Передача значений параметров осуществляется их помещением в тело запроса. Обязательным заголовком для данного вида запроса является Content-Type, в котором указывается кодировка для веб-сервера, что бы он знал как обрабатывать (раскодировать) HTTP-запрос.
Рассмотрим выполнение HTTP-запроса методом POST на примере сервиса Яндекс.Геокодер. В запросе мы будем передавать через параметр geocode название географического объекта, в ответ нам будут приходить сведения об этом объекте (координаты, название, адрес . . .).
Для выполнения POST-запроса у платформы 1С существует объект HTTPСоединение. У этого объекта имеется метод ОтправитьДляОбработки, с помощью которого выполняется HTTP-запрос методом POST. В этот метод передается объект HTTPЗапрос, который содержит параметры запроса и их значения. Результатом вызова метода является объект HTTPОтвет, содержащий некую информацию, которую сгенерировал сервер в ответ. Для объекта HTTPЗапрос обязательно задается заголовок Content-Type со значением application/x-www-form-urlencoded.
Функция выполнения POST-запроса на сервис Яндекс.Геокодер:
// Функция выполняет POST-запрос на сервис Яндекс.Геокодер.
//
// Параметры
// ГеографическийОбъект - строка - название географического объекта.
//
// Возвращаемое значение:
// Строка - ответ сервиса в формате xml.
//
&НаСервере
Функция ВыполнитьPOSTЗапрос(Знач ГеографическийОбъект)
ГеографическийОбъект = СтрЗаменить(ГеографическийОбъект, " ", "+");
Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded");
HTTPЗапрос = Новый HTTPЗапрос("/1.x/", Заголовки);
// Всегда используется только UTF-8, независимо от языка страницы.
// Если сервер вдруг ожидает данные в windows-1251 (к примеру), то их нужно будет перекодировать.
HTTPЗапрос.УстановитьТелоИзСтроки("geocode=" + ГеографическийОбъект, "windows-1251");
HTTPСоединение = Новый HTTPСоединение("geocode-maps.yandex.ru");
HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
Возврат HTTPОтвет.ПолучитьТелоКакСтроку();
КонецФункции // ВыполнитьPOSTЗапрос()
У название географического объекта перед выполнением POST-запроса необходимо все пробелы заменить на "+".
Пример вызова сервиса методом POST:
Обработку можно скачать по этой ссылке.
Пример вызова сервиса методом POST:
![]() |
Пример получения информации о улице Лизюкова в г.Воронеж |
Обработка не работает. Возвращает код 301.
ОтветитьУдалитьНа момент написания статьи POST-запросы производились по протоколу http. Вероятнее всего это происходит из-за того, что яндекс перешел на https, так как с http идет переадресация на https и возникает ошибка "301 Moved Permanently". Дружит ли 1С с https еще не проверял.
УдалитьЗдравствуйте. А может подскажите. Беру ваш пример.
УдалитьДелаю вот так:
&НаСервере
Функция ВыполнитьPOSTЗапрос()
Баланс = ТЗВзаиморасчеты();
Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded");
HTTPЗапрос = Новый HTTPЗапрос("main?func=setbillingstatus&auth_login=login&auth_pass=test", Заголовки);
HTTPЗапрос.УстановитьТелоИзСтроки("xml=" + Баланс, "UTF-8");
HTTPСоединение = Новый HTTPСоединение("95.181.95.555",9999,,,,,);//адрес фиктивный
HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
Возврат HTTPОтвет.ПолучитьТелоКакСтроку();
КонецФункции // ВыполнитьPOSTЗапрос()
Сервер возвращает ответ: "не задан параметр func".
Что я делаю не так?
Попробуйте так:
УдалитьHTTPЗапрос = Новый HTTPЗапрос("main", Заголовки);
HTTPЗапрос.УстановитьТелоИзСтроки("func=setbillingstatus&auth_login=login&auth_pass=test&xml=" + Баланс, "UTF-8");
Спасибо получилось.
УдалитьСпасибо за статью!!
ОтветитьУдалитьАвтор, спасибо. Подскажите на пример, как обойти 301 ошибку
ОтветитьУдалитьСервер = "wildberries.ru";
Ури = "/catalog/7051448/detail.aspx?targetUrl=NW";
Соединение = Новый HTTPСоединение (Сервер,,,, Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Неопределено));
Запрос = Новый HTTPЗапрос (Ури);
Ответ = Соединение. Получить (Запрос);