Имя: Пароль:
1C
1C 7.7
v7: Http запрос на сайт
0 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?
1 arsik
 
гуру
16.06.20
13:49
Например так
Если (HTTPxml.Status = 200) Тогда
    ОтветСервера = HTTPxml.ResponseText;
КонецЕсли;
2 arsik
 
гуру
16.06.20
13:50
+(1) Сорян затупил
3 arsik
 
гуру
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);
      Возврат;
   КонецЕсли;
4 zerat
 
16.06.20
14:13
Ошибку выдаёт

ADODB.Stream: Аргументы имеют неверный тип, выходят за пределы допустимого диапазона или вступают в конфликт друг с другом.
5 zerat
 
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();
6 zerat
 
16.06.20
14:15
это 1с 7.7 если что)
7 arsik
 
гуру
16.06.20
14:31
(4) На какой строчке ошибка?
8 arsik
 
гуру
16.06.20
14:32
(5)  Что за фигня?
oADOStream.Type = 1;
oADOStream.Type = 3;
Копипасти правильно
oADOStream.Type = 1;
oADOStream.Mode = 3;
9 zerat
 
16.06.20
14:49
Поправила теперь такая

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

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