Поиск по блогу

вторник, 24 марта 2015 г.

Выполнение POST-запроса на примере 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:
Пример получения информации о улице Лизюкова в г.Воронеж
Обработку можно скачать по этой ссылке.

6 комментариев:

  1. Обработка не работает. Возвращает код 301.

    ОтветитьУдалить
    Ответы
    1. На момент написания статьи POST-запросы производились по протоколу http. Вероятнее всего это происходит из-за того, что яндекс перешел на https, так как с http идет переадресация на https и возникает ошибка "301 Moved Permanently". Дружит ли 1С с https еще не проверял.

      Удалить
    2. Здравствуйте. А может подскажите. Беру ваш пример.
      Делаю вот так:

      &НаСервере
      Функция Выполнить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".
      Что я делаю не так?

      Удалить
    3. Попробуйте так:
      HTTPЗапрос = Новый HTTPЗапрос("main", Заголовки);
      HTTPЗапрос.УстановитьТелоИзСтроки("func=setbillingstatus&auth_login=login&auth_pass=test&xml=" + Баланс, "UTF-8");

      Удалить
    4. Спасибо получилось.

      Удалить