Простой пример HTTP-запроса: поиск в Яндекс/Google


Пример взаимодействия со сторонними REST сервисами из 1С:Предприятия 8.3

Задача:

Возникла задача поиска фраз в интернете. Решил поделиться результатами=)

Статей на тему HTTP-запросов достаточно, но ничего не нашел насчет работы с поисковыми системами.

Предыстория:

Подробнее об использовании GET и POST-запросов можно узнать ниже.

О протоколе HTTP можно узнать тут: https://ru.wikipedia.org/wiki/HTTP

Описание REST интерфейса в прикладных решениях: http://v8.1c.ru/o7/201312rest/index.htm

HTTP-сервисы в прикладных решениях: http://v8.1c.ru/o7/201312http/index.htm

Собственно сам код GET-запроса:

 Если ТочноеСоответствие Тогда
ТочныйПоиск = "&wordforms=exact";
КонецЕсли;

Если ГдеИскать = "Yandex" Тогда
стрURL  = "http://yandex.ru/search/?text=" + СокрЛП(ТекстПоиска) + "&lr=2" + ТочныйПоиск;
Иначе
Если ТочноеСоответствие Тогда
стрURL  = "http://www.google.ru/#q=" + СокрЛП(ТекстПоиска) + "&newwindow=1&tbs=li:1";
Иначе
стрURL  = "http://www.google.ru/#q=" + СокрЛП(ТекстПоиска) + "&newwindow=1&tbas=0";
КонецЕсли;
КонецЕсли;

//вычислить адрес сервера из адресной сторки
//пример АдресСервера: "yandex.ru"
АдресСервера1 = СтрЗаменить(стрURL, "http://" ,"");
ИндексСлеша   = Найти(АдресСервера1, "/");
АдресСервера  = Сред(АдресСервера1, 0 ,индексСлеша - 1);

//вычислить строку URL
//пример URL: "/search/?text=1C&lr=2&wordforms=exact""
ДлинаСтроки = СтрДлина(АдресСервера1);
URL = "/" + Прав(АдресСервера1, ДлинаСтроки - ИндексСлеша);

//установим заголовки соединения
//каждая страница требует индивидуального подхода
ЗаголовокGET = Новый Соответствие();
ЗаголовокGET.Вставить("GET " + URL + " HTTP/1.1");
//ЗаголовокGET.Вставить("Accept"                   , "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
//ЗаголовокGET.Вставить("Accept-Encoding"          , "gzip, deflate, sdch");
//ЗаголовокGET.Вставить("Accept-Language"          , "ru,en;q=0.8");

Попытка

//ВременныйФайл = ПолучитьИмяВременногоФайла("html");

ssl1 = Новый ЗащищенноеСоединениеOpenSSL(
Новый СертификатКлиентаWindows(СпособВыбораСертификатаWindows.Авто),
Новый СертификатыУдостоверяющихЦентровWindows());

HTTPСоединение = Новый HTTPСоединение(АдресСервера,,,,,,ssl1);

HTTPЗапрос     = Новый HTTPЗапрос(URL, ЗаголовокGET);

//HTTPОтвет      = HTTPСоединение.Получить(HTTPЗапрос, ВременныйФайл);
HTTPОтвет      = HTTPСоединение.Получить(HTTPЗапрос);

КодСостояния   = HTTPОтвет.КодСостояния;

ТекстОтвета    = HTTPОтвет.ПолучитьТелоКакСтроку();

Исключение
Сообщить("Не удалось установить соединение с сервером :"
+ Символы.ПС + ИнформацияОбОшибке().Описание);
Возврат;
КонецПопытки; //

Если КодСостояния=200 Тогда
Если Найти(ТекстОтвета, "По вашему запросу ничего не нашлось")>0
ИЛИ Найти(ТекстОтвета, "ничего не найдено.")>0 Тогда
Сообщить("По вашему запросу ничего не нашлось.");
Иначе
Сообщить("Поиск дал результаты.");
КонецЕсли;
Иначе
Сообщить("Не удалось выполнить поисковый запрос.");
КонецЕсли;


 

Прикладываю обработку.

11 Comments

  1. premierex

    (0) Я так полагаю, что следовало бы указать платформу 1С:Предприятие.

    На платформе 8.2 следующий код просто вызовет ошибку:



    ssl1 = Новый ЗащищенноеСоединениеOpenSSL(

    Новый СертификатКлиентаWindows(СпособВыбораСертификатаWindows.Авто),

    Новый СертификатыУдостоверяющихЦентровWindows());

    Reply
  2. Dimz_z

    (1) premier, исправлю. По скриншотам видно, что интерфейс «Такси»:)

    Reply
  3. TMV

    (0) все, что указано в заголовках соединения, не нужно, кроме первого.

    Reply
  4. BorovikSV

    (0) Клюнул на «Пример использования REST интерфейса 1С:Предприятия», оказался обычный GET запрос.

    Зачем же вводить в заблуждение? (от меня минус именно за это)

    Reply
  5. Dimz_z

    (4) BorovikSV, не было цели вводить в заблуждение. Исправил.

    Reply
  6. Программулькин

    как то не закончено, может результат как то вывести?

    Reply
  7. Dimz_z

    (6) Программулькин, пример не является законченным решением=)

    Reply
  8. Arxxximed

    (0)

    Ой , убрали самое интересное, хорошо что со вчера не обновлял страницу

    Вопрос в следующем:

    Добавление заголовка HTTPЗапрос

     ЗаголовокGET.Вставить(«Accept-Encoding»          , «gzip, deflate, sdch»);
    

    Вернет сжатый ответ.

    Все же как его прочитать и получить текст HTML?

    Reply
  9. Dimz_z

    (8) Arxxximed, html файл файл можно получить так:

    ВременныйФайл = ПолучитьИмяВременногоФайла(«html»);

    ssl1 = Новый ЗащищенноеСоединениеOpenSSL(

    Новый СертификатКлиентаWindows(СпособВыбораСертификатаWindows.Авто),

    Новый СертификатыУдостоверяющихЦентровWindows());

    HTTPСоединение = Новый HTTPСоединение(АдресСервера,,,,,,ssl1);

    HTTPЗапрос = Новый HTTPЗапрос(URL, ЗаголовокGET);

    HTTPОтвет = HTTPСоединение.Получить(HTTPЗапрос, ВременныйФайл);

    КодСостояния = HTTPОтвет.КодСостояния;

    Reply
  10. Phoenix204

    Здравствуйте, код для яндекса перестал работать (до этого работал)

    Reply
  11. user910617

    Ещё не обновлялась структура http-запроса? Была на хабре статья по поводу изменений

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *