Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: Http запрос на сайт

v7: Http запрос на сайт
Я
   zerat
 
16.06.20 - 13:46
Всем привет!
Пишу обработку которая отправляет POST запросы на сайт, чтобы получить в итоге информацию о заказах в формате xml.

Мой код такой

    Запрос = СокрЛП("http://test11ev.ru/bitrix/admin/1c_exchange.php";);  
    
    ЗапросА = Запрос + "?AUTH_FORM=Y&TYPE=AUTH&USER_LOGIN="
    + СокрЛП("admin")
    + "&USER_PASSWORD="
    + СокрЛП("admin");
    
    HTTPxml =  СоздатьОбъект("WinHttp.WinHttpRequest.5.1"); //MSXML2.ServerXMLHTTP.6.0");//Microsoft.XMLHTTP");
    HTTPxml.Open("POST", ЗапросА, 0);
    HTTPxml.Send();

    Запрос = Запрос + "?type=sale&mode=";
    HTTPxml.Open("POST", Запрос + "checkauth", 0);
    HTTPxml.Send();

    Сообщить("Авторизация на сайте ");
    Сообщить(HTTPxml.responseText);
    
    Если Лев(HTTPxml.responseText, 7) <> "success" Тогда
        Сообщить("Ошибка авторизации на сайте!");
        Возврат;
    КонецЕсли;  
        
    HTTPxml.Open("POST", Запрос + "init", 0);
    HTTPxml.Send();
    Сообщить("Инициализация обмена на сайте");
    Сообщить(HTTPxml.responseText);
    
    Если Лев(HTTPxml.responseText,7) = "failure" Тогда
        Сообщить("Ошибка инициализации обмена на сайте!");
        Возврат;
    КонецЕсли;
    
    HTTPxml.Open("POST", Запрос + "query", 0);
    HTTPxml.Send();
    Сообщить("Инициализация файла");


После отправки запроса сайт в качестве ответа отправляет сам текст с заказами

Как мне его сохранить в виде файла xml?
   arsik
 
1 - 16.06.20 - 13:49
Например так
Если (HTTPxml.Status = 200) Тогда
    ОтветСервера = HTTPxml.ResponseText;
КонецЕсли;

   arsik
 
2 - 16.06.20 - 13:50
+(1) Сорян затупил
   arsik
 
3 - 16.06.20 - 13:51
(0) Вот правильнее
  WinHttp.Open("GET", "http://ru.wordpress.org/wordpress-4.0-ru_RU.zip";, Ложь);

   WinHttp.Send();
   Если WinHttp.Status = 200 Тогда
      Stream = Новый COMОбъект("ADODB.Stream");

      Stream.Type = 1;
      Stream.Mode = 3;

      Stream.Open();
      Stream.Write(WinHttp.ResponseBody);
      Stream.SaveToFile("C:\1.zip", 2);
      Stream.Close();
      Stream = Неопределено;
   Иначе
      Сообщить("HTTP " + WinHttp.Status + " " + WinHttp.StatusText);
      Возврат;
   КонецЕсли;

   zerat
 
4 - 16.06.20 - 14:13
Ошибку выдаёт

ADODB.Stream: Аргументы имеют неверный тип, выходят за пределы допустимого диапазона или вступают в конфликт друг с другом.
   zerat
 
5 - 16.06.20 - 14:15
Или мне тут переписать надо на GET?
    HTTPxml.Open("POST", Запрос + "query", 0);
    HTTPxml.Send();
    Сообщить("Инициализация файла");

    oADOStream = СоздатьОбъект("ADODB.Stream");
    oADOStream.Type = 1;//тип данных - Binary

    oADOStream.Type = 3; 
    oADOStream.Open(); 
       oADOStream.Write(HTTPxml.ResponseBody);
    oADOStream.SaveToFile("F:\1.zip",2);
       oADOStream.Close();
   zerat
 
6 - 16.06.20 - 14:15
это 1с 7.7 если что)
   arsik
 
7 - 16.06.20 - 14:31
(4) На какой строчке ошибка?
   arsik
 
8 - 16.06.20 - 14:32
(5)  Что за фигня?
oADOStream.Type = 1;
oADOStream.Type = 3; 
Копипасти правильно
oADOStream.Type = 1;
oADOStream.Mode = 3;
   zerat
 
9 - 16.06.20 - 14:49
Поправила теперь такая

oADOStream.Write(HTTPxml.ResponseBody);
Тип переменой не поддерживается
   zerat
 
10 - 16.06.20 - 14:50
HTTPxml.Open("GET", Запрос + "query", 0);
    
    HTTPxml.Send();
    Если HTTPxml.Status = 200 Тогда
    
    oADOStream = СоздатьОбъект("ADODB.Stream");
    oADOStream.Type = 1;//тип данных - Binary

    oADOStream.Mode = 3; 
    oADOStream.Open(); 
    oADOStream.Write(HTTPxml.ResponseBody);
    oADOStream.SaveToFile("F:\1.zip",2);
       oADOStream.Close();
     
       КонецЕсли;
   vladko
 
11 - 16.06.20 - 15:03
Я решаю подобную задачу тоже 7.7

Делаю POST запрос на авторизацию, затем проверяю что возвращает сайт:
HTTPxml.ResponseText() возвращает 
<?xml version="1.0" encoding="UTF-8"?>
<response status="ok"><sid>ebe81ab7ef315025ec2d955b88e2c44b</sid></response>
т.е. нормальный xml.

Пытаюсь сделать:
oADOStream = СоздатьОбъект("ADODB.Stream");
оADOStream.Type = 1//тип данных - Binary

oADOStream.Mode = 3; 
oADOStream.Open(); 
oADOStream.Write(HTTPxml.ResponseText());
oADOStream.SaveToFile("D:\BASES\1Cv77\tempIn.xml",2);
oADOStream.Close();

на строке
oADOStream.Write(HTTPxml.ResponseText());
выходит ошибка:
"ADODB.Stream: Аргументы имеют неверный тип, выходят за пределы допустимого диапазона или вступают в конфликт друг с другом."

А если сделать
oADOStream.Write(HTTPxml.ResponseBody);
то такая ошибка на этой же строке:
"Тип переменой не поддерживается"

Вообще, если не пользоваться ADODB.Stream и сделать просто
ОтветСайта = HTTPxml.ResponseText();

то такой маленький ответ без проблем можно обработать,
А когда далее сделующий ответ приходит с заказами, то строка
ОтветСайта = HTTPxml.ResponseText();
выдаёт ошибку, что "длина строки превышает максимальное количество знаков". Видимо у 7.7 есть ограничение на длину текстовой строки.
   arsik
 
12 - 16.06.20 - 15:24
(11) Ну все правильно. Сайт вам текст возвращает потому что, там он сразу готов, а вот если бы возвращал бинарные данные, тогда нужен ADODB.Stream.
А ругается на oADOStream.Write - потому что во входящем параметре у вас текст, а там ожидаются бинарные данне.
   zerat
 
13 - 16.06.20 - 15:25
(12) а как забрать весь текст?
   arsik
 
14 - 16.06.20 - 15:27
(13) оADOStream.Type = 1//тип данных - Binary - это тебе ничего не говорит?
   zerat
 
15 - 16.06.20 - 15:28
(14) да, это я понял. Подскажи пожалуйста как сделать верно?)
   arsik
 
16 - 16.06.20 - 15:31
(15) Все уже разжевано.
   arsik
 
17 - 16.06.20 - 15:35
+(16) А не, там просто другой метод нужно использовать с другими параметрами :)
https://bit.ly/30LHBxW
   zerat
 
18 - 16.06.20 - 15:37
(17) спасибо!
   Ёпрст
 
19 - 16.06.20 - 15:38
(11) дык в сообщить его не выводи и всё, хотя бы в Предупреждение, если охота посмотреть
   vladko
 
20 - 16.06.20 - 16:32
что-то не могу найти описание параметров и методов ADODB.Stream, например у writetext, SaveToFile что там значат вторые параметры.
Файл теперь записывается, когда oADOStream.Type = 2 сделал, но видимо в кодировку utf-8, а надо в windows-1251
   trad
 
21 - 16.06.20 - 17:12
(0)
HTTPxml = СоздатьОбъект("Msxml2.ServerXMLHTTP");
HTTPxml.open("GET", url, 0);
HTTPxml.send();
Если Query.status = 200 Тогда
  HTTPxml.responseXML.save(ИмяФайла);
КонецЕсли;
   trad
 
22 - 16.06.20 - 17:14
(21) + или, с HTTPxml.responseXML, без всякого сохранения хоть перебор DOM документа, хоть XPath
   trad
 
23 - 16.06.20 - 17:15
(21) Query.status читать как HTTPxml.status
   arsik
 
24 - 16.06.20 - 17:17
(20) -> (17)
   vladko
 
25 - 16.06.20 - 19:47
В общем, всё получилось. Может кому-то полезно будет


Функция Кодировать(Стр, Кодировка)
    ЦДО=СоздатьОбъект("CDO.Message");
    БодиПарт=ЦДО.BodyPart;
    Поля=БодиПарт.Fields;
    Поле=Поля.Item("urn:schemas:mailheader:content-type");
    Поле.Value="text/plain; charset=""windows-1251""";
    Поля.Update();
    Стрим = БодиПарт.GetDecodedContentStream();
    Стрим.charset = "windows-1251";
    Стрим.WriteText(Стр);
    Стрим.Flush();
    БодиПарт.ContentTransferEncoding = Кодировка;
    Стрим=БодиПарт.GetEncodedContentStream();
    Возврат Стрим.ReadText();
КонецФункции

Процедура ОтправитьЗапрос()

КлючАПИ64 = Кодировать(КлючАПИ+":","base64"); //Закодируем ключ АПИ в base64
    
лпСайт="https://.....";;

oADOStream = СоздатьОбъект("ADODB.Stream");
oADOStream.Type = 1; //Binary
oADOStream.Open();
oADOStream.LoadFromFile(ТелоЗапроса); //ТелоЗапроса - мой файл .xml для сервера
    
WinHttp = СоздатьОбъект("WinHttp.WinHttpRequest.5.1");
WinHttp.Option(2,"windows-1251");
//Сам запрос
WinHttp.Open("POST", лпСайт, 0);
//WinHttp.SetRequestHeader("Content-Type","text/plain;charset=windows-1251");//
WinHttp.SetRequestHeader("Content-Type","text/xml");//
WinHttp.SetRequestHeader("Accept",     "*/*");    
WinHttp.SetRequestHeader("Cache-Control",     "no-cache");    
WinHttp.SetRequestHeader("Authorization",     "Basic "+КлючАПИ64+"");    
WinHttp.Send(oADOStream);
oADOStream.Close();

//Смотрим, что ответил сайт, сохраняем ответ в кодировке windows-1251
Чарсет="windows-1251";
oADOStream = СоздатьОбъект("Adodb.Stream");
oADOStream.Type = 2;
oADOStream.Mode = 3;        
oADOStream.charset = Чарсет;
oADOStream.Open();
oADOStream.WriteText(СокрЛП(WinHttp.ResponseText()));
oADOStream.SaveToFile("D:\tempIn.xml",2);
oADOStream.Close();

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


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.