|
v7: Чтение XML POST - запросы | ☑ | ||
---|---|---|---|---|
0
DeMi4
28.03.17
✎
17:13
|
Есть вот такой запрос.
GetTask = "<soapenv:Envelope xmlns:soapenv=""http://schemas.xmlsoap.org/soap/envelope/"" xmlns:ser=""http://serviceinterface_v1.b2b.audatex.com""> | <soapenv:Header/> | <soapenv:Body> | <ser:getTaskRequest> | <!--Zero or more repetitions:--> | <ser:parameter xsltParameter=""?""> | <ser:name>loginId</ser:name> | <ser:value>VALUE_LOGINID</ser:value> | </ser:parameter> | <ser:parameter xsltParameter=""?""> | <ser:name>password</ser:name> | <ser:value>VALUE_PASSWORD</ser:value> | </ser:parameter> | <ser:parameter xsltParameter=""?""> | <ser:name>taskId</ser:name> | <ser:value>VALUE_TASKID</ser:value> | </ser:parameter> | <ser:parameter xsltParameter=""?""> | <ser:name>noAttachmentContents</ser:name> | <ser:value>true</ser:value> | </ser:parameter> | <ser:parameter xsltParameter=""?""> | <ser:name>nocalculation</ser:name> | <ser:value>false</ser:value> | </ser:parameter> | </ser:getTaskRequest> | </soapenv:Body> |</soapenv:Envelope>"; Который отправляется на сервер вот таким образом МакетRequest = GetTask; Сообщить(МакетRequest); wsdlRequest = МакетRequest; wsdlRequest = СтрЗаменить(wsdlRequest, "VALUE_LOGINID", ЛОГИН); wsdlRequest = СтрЗаменить(wsdlRequest, "VALUE_PASSWORD", ПАРОЛЬ); wsdlRequest = СтрЗаменить(wsdlRequest, "VALUE_TASKID", TaskId); WinHTTP = СоздатьОбъект("WinHttp.WinHttpRequest.5.1"); WinHttp.Option(2,"Windows-1251"); WinHTTP.Open("POST", "https://www.audatex.ru/b2b/services/TaskService_v1?wsdl", 0); WinHttp.SetRequestHeader("Accept-Language", "ru"); WinHttp.SetRequestHeader("Accept-Charset","Windows-1251"); WinHttp.setRequestHeader("Content-Language", "ru"); WinHttp.setRequestHeader("Content-Charset", "Windows-1251"); WinHTTP.setRequestHeader("Content-Type","text/xml;charset=utf-8"); WinHTTP.setRequestHeader("Content-Length", СтрДлина(wsdlRequest)); WinHTTP.setRequestHeader("SOAPAction", "'url'"); WinHTTP.send(глПреобразоватьСтрокуВUTF8(wsdlRequest)); Если (WinHTTP.Status = 200) Тогда Ответ = WinHTTP.ResponseText; Иначе Сообщить("Статус ответа WinHttpRequest " + Строка(WinHTTP.Status) + ", произошла ошибка!"); Ответ = ""; КонецЕсли; Возврат Ответ; В ответе приходит XML, далее я пытаюсь обработать используя ДОМ = CreateObject("Msxml2.DOMDocument"); ДОМ.loadXML(ОТВЕТ); ДОМ.setProperty("SelectionLanguage", "XPath"); После чего 1С просто падает. Ответ прилетает большой, проблемы нет когда ответ не слишком большой. |
|||
1
Злопчинский
28.03.17
✎
17:14
|
попробуй охрани ответ как файл
и уже потом файл курочь ?? |
|||
2
Serginio1
28.03.17
✎
17:20
|
Проще использовать Вэб сервис напрямую
Здесь есть примеры Использование классов .Net в 1С для новичков Кроме того можно использовать Xdocument Как указать Namespace при выборе тегов в хмл |
|||
3
DeMi4
28.03.17
✎
19:45
|
нашел место где происходит затык и полное зависание при выполнении
ВыражениеXPath = ДОМ.SelectNodes("//*[local-name() = 'payload']"); причем с какими то ответами прилетающими с сервака все гуд а с какими то нет. Сохранял все в файлы разницы не обнаружил. Может кто сталкивался? |
|||
4
DrShad
28.03.17
✎
19:49
|
С чем сталкивался? Одному богу известно что тебе приходит и почему валится на простой выборке
|
|||
5
DrShad
28.03.17
✎
19:50
|
Сохрани ответ в файл и открой каким-то вьюером, увидишь ошибку
|
|||
6
DeMi4
28.03.17
✎
19:56
|
В том то и дело что файлы открываются нормальные, без каких либо нареканий,все нормально отображаются
|
|||
7
trad
28.03.17
✎
21:08
|
Не используй ResponseText. Смотри в сторону ResponseXML.
|
|||
8
MWWRuza
гуру
30.03.17
✎
08:35
|
Проблема известная.
Если файлы больше 570КБ, используйте альтернативные методы. Например: Размер = Скрипт.Eval("LenB(WinHttp.responseBody)"); Если (Размер > 570*1024) ИЛИ (Константа.ВсегдаИспользоватьCurl = 1) Тогда // 1С падает, если размер файла больше 570 Кб WShell = СоздатьОбъект("WScript.Shell"); ВременнаяПапка = WShell.ExpandEnvironmentStrings("%TEMP%") + "\"; ПутьВременногоФайла = ПолучитьИмяВременногоФайла(ВременнаяПапка); Команда = "curl " + URL + " > " + ПутьВременногоФайла; КодВозврата = WShell.Run("%COMSPEC% /C "+Команда, 0, 1); Если КодВозврата <> 0 Тогда Предупреждение("Невозможно получить XML-файл. Возможно не установлен cUrl."); Сообщить("Пожалуйста, проверьте что УТМ запущен, а файл curl.exe (http://curl.haxx.se/download.html) | скопирован в папку Windows."); Возврат ""; КонецЕсли; XML_DOM.Load(ПутьВременногоФайла); ФС.УдалитьФайл(ПутьВременногоФайла); Иначе Скрипт.Eval("Stream.Write(WinHttp.responseBody)"); Стрим.Position = 0; Стрим.Type = 2; Стрим.Charset = "utf-8"; Ответ = Стрим.ReadText(); Стрим.Close(); XML_DOM.LoadXML(Ответ); КонецЕсли; |
|||
9
MWWRuza
гуру
30.03.17
✎
08:42
|
Код не мой, но я активно использую в своих разработках.
Смысл в том, что мелкие файлы, размером менее 570Кб, получаю напрямую, а если больше - то через утилиту curl. Все работает нормально. И для отправки аналогично. |
|||
10
Адинэснег
30.03.17
✎
09:11
|
нафига внешние компоненты? средствами языка нельзя?
|
|||
11
Адинэснег
30.03.17
✎
09:12
|
а все, вижу, клюшки
|
|||
12
DeMi4
30.03.17
✎
12:06
|
спасибо буду пробовать
|
|||
13
DeMi4
30.03.17
✎
12:12
|
(8) А что за переменные такие скрипт и стрим?
|
|||
14
trad
30.03.17
✎
13:02
|
вместо этого:
WinHTTP = СоздатьОбъект("WinHttp.WinHttpRequest.5.1"); WinHTTP.Open() WinHTTP.send() Ответ = WinHTTP.ResponseText; ДОМ = CreateObject("Msxml2.DOMDocument"); ДОМ.loadXML(ОТВЕТ); используй это: XMLHTTP = СоздатьОбъект("Msxml2.ServerXMLHTTP"); XMLHTTP.open("GET", url, 0); XMLHTTP.send(); ДОМ = XMLHTTP.responseXML; - и не нужно никаких промежуточных строк, файлов и прочих обкладок |
|||
15
MWWRuza
гуру
30.03.17
✎
20:38
|
(13)
Скрипт=СоздатьОбъект("MSScriptControl.ScriptControl"); Стрим = СоздатьОбъект("ADODB.Stream"); |
|||
16
DeMi4
31.03.17
✎
13:45
|
Ну собственно в продлжение темы. Замучал меня этот ХМЛ. Решил опробовать и опкатать XMLHTTP = СоздатьОбъект("Msxml2.ServerXMLHTTP"); Запросы идут все прилетает. но возникла проблема с попыткой отпарсить
ВыражениеXPath = ДОМ.SelectNodes("//*[local-name() = 'payload']"); сзВложенныеXML = СоздатьОбъект("СписокЗначений"); Для Н = 1 ПО ВыражениеXPath.Length Цикл Узел = ВыражениеXPath.item(Н - 1); сзВложенныеXML.ДобавитьЗначение(Узел); КонецЦикла; //глПоказатьТЗ(ТаблицаСпискаДел); глПоказатьТЗ(сзВложенныеXML); //Возврат; Для ХМЛ = 1 По сзВложенныеXML.РазмерСписка() Цикл ХМЛЛУзелДОМ = сзВложенныеXML.ПолучитьЗначение(ХМЛ); ХМЛЛУзелДОМ - это IXMLDOMElement Искомые мною ноды все есть но почему то я их не могу получить. Узел = ХМЛЛУзелДОМ.firstChild; //Сообщить(ХМЛЛУзелДОМ.nodeName); //Продолжить; // РезультатVehicleIdentification = ХМЛЛУзелДОМ.SelectNodes("//*[local-name() = 'Task']/*[local-name() = 'BasicClaimData']/*[local-name() = 'Vehicle']/*[local-name() = 'VehicleIdentification']"); РезультатVehicleIdentification = Узел.SelectNodes("//*[local-name() = 'Task']"); Сообщить(РезультатVehicleIdentification.Length); Для х=1 По РезультатVehicleIdentification.Length Цикл УзелVehicleIdentification = РезультатVehicleIdentification.Item(х-1); //Сообщить(РезультатVehicleIdentification); Для хх=1 По УзелVehicleIdentification.childNodes.Length Цикл ЭлементDOM = УзелVehicleIdentification.ChildNodes.Item(хх-1); ИмяКолонки = ЭлементDOM.NodeName; //Попытка // Если ТаблицаВозврата.ПолучитьПараметрыКолонки(ИмяКолонки) = 0 Тогда // ТаблицаВозврата.НоваяКолонка(ИмяКолонки,,,,,25); // КонецЕсли; //Исключение // ТаблицаВозврата.НоваяКолонка(ИмяКолонки,,,,,25); //КонецПопытки; // //ТаблицаВозврата.УстановитьЗначение(СтрокаТаблицы, ИмяКолонки, ЭлементDOM.text); Если ИмяКолонки = "ManufacturerCodeAX" Тогда ManufacturerCodeAX = СокрЛП(ЭлементDOM.ТекстовоеСодержимое); ИначеЕсли ИмяКолонки = "ModelCodeAX" Тогда ModelCodeAX = СокрЛП(ЭлементDOM.ТекстовоеСодержимое); ИначеЕсли ИмяКолонки = "ManufacturerName" Тогда ManufacturerName = СокрЛП(ЭлементDOM.ТекстовоеСодержимое); ИначеЕсли ИмяКолонки = "ModelName" Тогда ModelName = СокрЛП(ЭлементDOM.ТекстовоеСодержимое); ИначеЕсли ИмяКолонки = "VIN" Тогда VIN = СокрЛП(ЭлементDOM.ТекстовоеСодержимое); КонецЕсли; Сообщить("ManufacturerCodeAX - " + ManufacturerCodeAX + " ModelCodeAX - " + ModelCodeAX + " ManufacturerName - " + ManufacturerName + " ModelName - " + ModelName + " VIN - " + VIN); КонецЦикла; КонецЦикла; КонецЦикла; |
|||
17
trad
31.03.17
✎
14:10
|
"Искомые мною ноды все есть но почему то я их не могу получить. "
какая конкретно строка кода не работает |
|||
18
totparen
31.03.17
✎
14:18
|
Парси через XmlLiteReader
Работающий код: https://github.com/binexekb/ExchangePlan77/commit/513e9eb9dc5f6051a992590f8d5d540bb51faec1?diff=split#diff-87b3c01c4039b977f851eafc26626590R799 |
|||
19
DeMi4
31.03.17
✎
14:26
|
(17) SelectNodes("//*[local-name() = 'Task']/*[local-name() = 'BasicClaimData']/*[local-name() = 'Vehicle']/*[local-name() = 'VehicleIdentification']");
|
|||
20
trad
31.03.17
✎
14:34
|
(19) если xpath не работает, то вероятно выражение неверно написано
тут надо смотреть сам xml и то что хочешь выбрать |
|||
21
DeMi4
31.03.17
✎
14:40
|
(20) когда делаю сзВложенныеXML.ДобавитьЗначение(Узел.text); а потом засовываю в объект дом то все гуд, значит там все есть. Но если Узел.text получается очень большим то 1с валится(, вот я пробую передавать объекты которые содержат этот текст, но либо сам что то не так делаю либо вообще это не возможно.
|
|||
22
trad
31.03.17
✎
15:08
|
(21) хм.
в общем случае: Узел1 = Узел и Узел2 = дом.load(Узел.text) - не одно и тоже, хотя бы из-за используемых NS Не исключено, что из-за этого разное поведение. |
|||
23
DeMi4
31.03.17
✎
17:47
|
(8) а URL? я понимаю что ссылка, но на что?
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |