Использовать URL WSDL с XML с экранированными символами в качестве аргумента - PullRequest
2 голосов
/ 01 октября 2011

Я выполняю метод веб-службы SOAP, который получает 3 строковых аргумента с библиотекой suds.

Первый строковый аргумент должен быть XML, а 2 других - именем пользователя и паролем, это мои полурабочая реализация.

from suds.client import Client
url = "http://www.jonima.com.mx:3014/sefacturapac/TimbradoService?wsdl"
client = Client(url)
client.service.timbrado(XML_AS_STRING_HERE, 'PRUEBA1', '12345678')

Когда первый параметр содержит экранированный символ (амперсанд, кавычки, апостроф, меньше чем, больше чем), метод не работает, поскольку сервер интерпретирует текст так, как если бы он был экранированным.Если не содержит ни одного из этих символов, метод прекрасно работает

Пример XML без амперсанда http://dl.dropbox.com/u/1990697/no_amp.xml

Пример XML с амперсандом не работает http://dl.dropbox.com/u/1990697/with_amp.xml

Любая идея, как я могу передать XML с экранированными символами?

Не нужно полагаться на пену, а на python.Я использую Python 2.6 (как это может быть с 2.7, если требуется)

Я также использую Django Framework, не знаю, может ли это быть полезно.


Дополнительная информация:

  • У меня нет доступа для изменения сервера SOAP
  • Служба поддержки сказала, что мой xml верен и что он работает для них, поэтому ошибка в моей реализации (или где-то впена?)

Ответы [ 3 ]

2 голосов
/ 06 октября 2011

Я думаю, что виноват здесь библиотека suds. Когда вы отправляете свой экранированный xml в suds в качестве параметра методу client.service.timbrado, он также экранируется от него. Тем не менее, он видит, что вы уже вышли из амперсанда вот так:

...
descripcion="EJE&MPLO"
...

И это не ускользает от него дальше (хотя и должно). Вы должны запустить свой экранированный xml через xml.sax.saxutils.escape, прежде чем передать его в client.service.timbrado.

Это должно привести к тому, что приведенный выше фрагмент XML выглядит следующим образом:

...
descripcion="EJE&MPLO"
...

Когда я запускаю ваш код с дважды экранированным xml, я получаю следующий результат:

<?xml version="1.0" ?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
    <S:Body>
        <ns2:timbradoResponse xmlns:ns2="http://sefactura.com">
            <return>
                <status>401 - Fecha y hora de generación fuera de rango</status>
            </return>
        </ns2:timbradoResponse>
    </S:Body>
</S:Envelope>

Это ошибка в отношении ваших данных (дата и время генерации вне диапазона), а не в формате xml.

2 голосов
/ 04 октября 2011

Вы легко можете «избежать» любых значений XML, прежде чем они перейдут в сервис.Проверьте http://wiki.python.org/moin/EscapingXml

>>> from xml.sax.saxutils import escape
>>>
>>> escape("< & >")
'&lt; &amp; &gt;'

В прошлом мне удавалось делать именно то, что вы описываете, передавать данные XML по сети на страницу.

Согласно http://www.xmlnews.org/docs/xml-basics.html#references, просто экранирование данных перед их отправкой будет работать очень хорошо.

Для обработки вашего примера XML

...
descripcion="EJE&MPLO"
...

после его прохождения будет

...
descripcion="EJE&amp;MPLO"
...
1 голос
/ 06 октября 2011

Вы пытались избежать их дважды?

Если служба не работает, вы должны подать отчет об ошибке и принять меры предосторожности, чтобы вы заметили его, когда он будет исправлен и ваш обходной путь должен быть удален.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...