Как в soap сообщении явно указать каждому типу пространство имен
Обращаюсь к сторонней web-службе:
Определение = Новый WSОпределения("http://appl.dpd.ru:8080/services/geography?wsdl");
Прокси = Новый WSПрокси(Определение, "http://dpd.ru/ws/geography/2012-04-17", "DPDGeographyService", "DPDGeographyPort");
Фабрика = Прокси.ФабрикаXDTO;
Параметры = Фабрика.Создать(Фабрика.Тип("http://dpd.ru/ws/geography/2012-04-17","getTerminalsSelfDelivery"));
Параметры.auth = Фабрика.Создать(Фабрика.Тип("http://dpd.ru/ws/geography/2012-04-17","auth"));
Параметры.auth.clientKey = getClientKey();
Параметры.auth.clientNumber = getClientNumber();
Перехватываю soap сообщение сгенеренное 1С:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header/>
<soap:Body> <getTerminalsSelfDelivery xmlns="http://dpd.ru/ws/geography/2012-04-17"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<auth>
<clientNumber>xxx</clientNumber>
<clientKey>xxx</clientKey>
</auth>
</getTerminalsSelfDelivery></soap:Body>
</soap:Envelope>
Результат:
Ошибка SOAP сервера: com.sun.istack.XMLStreamException2: org.xml.sax.SAXParseException: cvc-complex-type.2.4.a: Invalid content was found starting with element 'auth'. One of '{auth}' is expected.
Если добавляю руками (руками в soapui) пространство имен
т.е. вместо
<getTerminalsSelfDelivery xmlns="http://dpd.ru/ws/geography/2012-04-17"
пишу
<nsogogo:getTerminalsSelfDelivery xmlns:nsogogo="http://dpd.ru/ws/geography/2012-04-17"
то все ок.
Как сделать что бы 1С-ка добавляла явно указания пространства имен?
*пожалуйста перенесите тему в нужный раздел
Определение = Новый WSОпределения("http://appl.dpd.ru:8080/services/geography?wsdl");
Прокси = Новый WSПрокси(Определение, "http://dpd.ru/ws/geography/2012-04-17", "DPDGeographyService", "DPDGeographyPort");
Фабрика = Прокси.ФабрикаXDTO;
Параметры = Фабрика.Создать(Фабрика.Тип("http://dpd.ru/ws/geography/2012-04-17","getTerminalsSelfDelivery"));
Параметры.auth = Фабрика.Создать(Фабрика.Тип("http://dpd.ru/ws/geography/2012-04-17","auth"));
Параметры.auth.clientKey = getClientKey();
Параметры.auth.clientNumber = getClientNumber();
Перехватываю soap сообщение сгенеренное 1С:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header/>
<soap:Body> <getTerminalsSelfDelivery xmlns="http://dpd.ru/ws/geography/2012-04-17"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<auth>
<clientNumber>xxx</clientNumber>
<clientKey>xxx</clientKey>
</auth>
</getTerminalsSelfDelivery></soap:Body>
</soap:Envelope>
Результат:
Ошибка SOAP сервера: com.sun.istack.XMLStreamException2: org.xml.sax.SAXParseException: cvc-complex-type.2.4.a: Invalid content was found starting with element 'auth'. One of '{auth}' is expected.
Если добавляю руками (руками в soapui) пространство имен
т.е. вместо
<getTerminalsSelfDelivery xmlns="http://dpd.ru/ws/geography/2012-04-17"
пишу
<nsogogo:getTerminalsSelfDelivery xmlns:nsogogo="http://dpd.ru/ws/geography/2012-04-17"
то все ок.
Как сделать что бы 1С-ка добавляла явно указания пространства имен?
*пожалуйста перенесите тему в нужный раздел
По теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
решена DPD ), вот кусок из их гайда, вдруг кому пригодится
Функция ПолучитьТекстЗапросПоЗаказамORDERNUM(Заказы, Заказчик, Ключ)
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
//ЗаписьXML.ЗаписатьОбъявлениеXML();
ЗаписьXML.ЗаписатьНачалоЭлемента("soap:Envelope");
ЗаписьXML.ЗаписатьАтрибут("xmlns:soap", "http://schemas.xmlsoap.org/soap/envelope/");
ЗаписьXML.ЗаписатьАтрибут("xmlns:ns0", "http://dpd.ru/ws/order2/2012-04-04");
ЗаписьXML.ЗаписатьНачалоЭлемента("soap:Header");
ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.ЗаписатьНачалоЭлемента("soap:Body");
ЗаписьXML.ЗаписатьНачалоЭлемента("ns0:getOrderStatus");
ЗаписьXML.ЗаписатьАтрибут("xmlns:xs", "http://www.w3.org/2001/XMLSchema");
ЗаписьXML.ЗаписатьАтрибут("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
ЗаписьXML.ЗаписатьНачалоЭлемента("orderStatus");
ЗаписьXML.ЗаписатьНачалоЭлемента("auth");
ЗаписьXML.ЗаписатьНачалоЭлемента("clientNumber");
ЗаписьXML.ЗаписатьТекст(Заказчик);
ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.ЗаписатьНачалоЭлемента("clientKey");
ЗаписьXML.ЗаписатьТекст(Ключ);
ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.ЗаписатьКонецЭлемента();
Для Каждого Заказ Из Заказы Цикл
ЗаписьXML.ЗаписатьНачалоЭлемента("order");
ЗаписьXML.ЗаписатьНачалоЭлемента("orderNumberInternal");
ЗаписьXML.ЗаписатьТекст(Заказ);
ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЦикла;
ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.ЗаписатьКонецЭлемента();
ТекстXML = ЗаписьXML.Закрыть();
Возврат ТекстXML;
КонецФункции
Функция ОтправитьЗапросWEBСервису(URL,ТекстXML,Таймаут = 10000)
Если ПустаяСтрока(ТекстXML) Тогда
Возврат "";
КонецЕсли;
WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
WinHttp.SetTimeouts(Таймаут, Таймаут, Таймаут, Таймаут);
WinHttp.Option(2,"utf-8");
WinHttp.Open("POST",URL);
WinHttp.setRequestHeader("Content-Type","text/xml; charset=utf-8");
Сообщить("Начало - " + ТекущаяДата());
Сообщить("URL: " + URL);
//Сообщить("ТекстXML запроса: " + ТекстXML);
Попытка
WinHttp.Send(ТекстXML);
Сообщить("Завершение - " + ТекущаяДата());
Если WinHttp.Status = 200 Тогда
Сообщить("Ответ: " + WinHttp.ResponseText);
Возврат(WinHttp.ResponseText);
Иначе
Сообщить("Ошибка сервера: " + WinHttp.Status + " " + WinHttp.ResponseText + " " + WinHttp.StatusText, СтатусСообщения.Важное);
Возврат("");
КонецЕсли;
Исключение
Сообщить(ОписаниеОшибки(), СтатусСообщения.Важное);
Возврат("");
КонецПопытки;
КонецФункции
Показать
...Еще полтора года спустя.
Да неужто в 1С так и нельзя сделать собственными методами??? Неужто только через XML?
Да неужто в 1С так и нельзя сделать собственными методами??? Неужто только через XML?
СообщениеСОАП="<soapenv:Envelope xmlns:soapenv=""http://schemas.xmlsoap.org/soap/envelope/"" xmlns:con=""http://iit.ru/portal/Contraginvoice"">
|<soapenv:Header/>
|<soapenv:Body>
| <con:DocListRequest>
| <cert_sn>222222</cert_sn>
| <inn>1111</inn>
| <kpp>22</kpp>
| <dateafter>"+Формат(ДатаНачала,"ДФ=dd.MM.yyyy")+"</dateafter>
| <datebefore>"+Формат(ДатаОкончания,"ДФ=dd.MM.yyyy")+"</datebefore>
| </con:DocListRequest>
|</soapenv:Body>
|</soapenv:Envelope>";
DOC=New COMОбъект("MSXML2.DOMDocument");
hostName="iit.ru";
urlAddress="http://iit.ru/IIT/ContrAgInvoice/services/ContrAgInvoice.wsdl";
DOC.loadXML(СообщениеСОАП);
Если DOC.parseError.errorCode <> 0 Тогда
Сообщить("Ошибка разбора XML " + DOC.parseError.reason);
Возврат;
КонецЕсли;
DOC.save( "сообщение.xml");
xmlHttp = New COMОбъект("MSXML2.xmlHttp");
xmlHttp.OPEN ("POST", urlAddress, False); // False- отвечает за то, что запрос асинхронный и ожидаем ответа
xmlHttp.setRequestHeader ("Host", hostName);
xmlHttp.setRequestHeader ("Content-type", "application/soap+xml; charset=""utf-8""");
xmlHttp.SEND (DOC);
Сообщить("" + xmlHttp.statusText);
DOCToSave=New COMОбъект("MSXML2.DOMDocument");
DOCToSave.loadXML(xmlHttp.responseText);
Если DOCToSave.parseError.errorCode <> 0 Тогда
Сообщить("Ошибка разбора XML результата: " + DOC.parseError.reason);
Возврат;
КонецЕсли;
DOCToSave.save("GetData.xml");
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот