|
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) Тогда
|
|||
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", Ложь);
|
|||
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(); КонецПроцедуры |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |