Вопрос по python, suds, soap, xml, wsdl – Добавление пространства имен xsi: type и envelope при использовании SUDS

1

Мне нужно взаимодействовать со службой SOAP, и у меня много проблем с этим; был бы очень признателен за любые указания на это. Исходное сообщение об ошибке было:

org.apache.axis2.databinding.ADBException: Any type element type has not been given

После некоторых исследований выясняется, что это разногласие между SUDS и сервером, как справиться с

type="xsd:anyType"

на элементе, о котором идет речь.

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

Adding xsi:type="xsd:string" to each element which causes problems Adding xmlns:xsd="http://www.w3.org/2001/XMLSchema" to the SOAP Envelope

Итак, где SUDS в настоящее время делает это:

<SOAP-ENV:Envelope ... xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<ns3:Body>
  <ns0:method>
     <parameter>
        <values>
           <table>
              <key>EMAIL_ADDRESS</key>
              <value>[email protected]</value>
           </table>
        </values>
     </parameter>
  </ns0:method>

вместо этого он должен произвести следующее:

<SOAP-ENV:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" ... xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">

  <ns3:Body>
  <ns0:method>
     ...
     <parameter>
        <values>
           <table>
              <key xsi:type="xsd:string">EMAIL_ADDRESS</key>
              <value xsi:type="xsd:string">[email protected]</value>
           </table>
        </values>
     </parameter>
  </ns0:method>

Есть ли правильный способ сделать это? Я видел предложения по использованию ImportDoctor или MessagePlugins, но не понял, как достичь желаемого эффекта.

Ваш Ответ

2   ответа
10

которое я нашел, состояло в том, чтобы использовать MessagePlugin, чтобы по существу вручную исправить XML непосредственно перед отправкой. Я надеялся, что было что-то более элегантное, но по крайней мере это работает:

class SoapFixer(MessagePlugin):

    def marshalled(self, context):
        # Alter the envelope so that the xsd namespace is allowed
        context.envelope.nsprefixes['xsd'] = 'http://www.w3.org/2001/XMLSchema'
        # Go through every node in the document and apply the fix function to patch up incompatible XML. 
        context.envelope.walk(self.fix_any_type_string)

    def fix_any_type_string(self, element):
        """Used as a filter function with walk in order to fix errors.
        If the element has a certain name, give it a xsi:type=xsd:string. Note that the nsprefix xsd must also
         be added in to make this work."""
        # Fix elements which have these names
        fix_names = ['elementnametofix', 'anotherelementname']
        if element.name in fix_names:
            element.attributes.append(Attribute('xsi:type', 'xsd:string'))
Это сработало для меня, однако, я надеюсь, что кто-то найдет лучшее решение для самой структуры, поэтому нам не нужно обходить эту проблему.
герой! у меня ушло несколько часов, чтобы понять это
Это было давно, но, насколько я помню, это должно сработать. Вы получаете сообщение об ошибке? somewhatoff
Здравствуйте, я очень заинтересован в использовании SoapFixer. Но как вы реализуете плагин, я попробовал позвонить client = Client (wsdl, plugins = [& soposFixer () & apos;]), но это, похоже, не работает
1

как и многое в этой конкретной библиотеке, но вот точный ответ:

http://lists.fedoraproject.org/pipermail/suds/2011-September/001519.html

из вышесказанного:

soapenv = soapenv.encode('utf-8')
plugins.message.sending(envelope=soapenv)

будет выглядеть так:

soapenv = soapenv.encode('utf-8')
ctx = plugins.message.sending(envelope=soapenv)
soapenv = ctx.envelope

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

да - в случае с magento, над которым я работал, почти все - "вздох".
не уверен, что вам сказать - я использую его в производстве для проекта, над которым я работаю, поэтому я уверен, что он работает. Вы прошли и изучили значения soapenv, ctx, а затем снова soapenv? Вы проверили, что ваши плагины делают то, что они должныand are returning a result?
Я пошел в другом направлении - восстанавливая свой серверный код :)stackoverflow.com/questions/13593950/… Я сделал шаг вперед ... Я не совсем помню, но я не видел, чтобы многое случилось с мылом IIRC. Я могу быть совершенно не прав, хотя.
это не сработало для меня ... но пока не проголосовало. Я мог что-то напортачить. Кто-нибудь еще может заставить это решение работать?
вау это все что я могу сказать Жаль, что у меня не было доступа к серверной части уравнения с конкретной интеграцией API, которая вытащила меня через этот конкретный участок грязи.

Похожие вопросы