неверный конверт SUDS - PullRequest
       5

неверный конверт SUDS

2 голосов
/ 05 января 2011

Когда я пытаюсь выполнить этот код:

mmurl = 'http://server/_mmwebext/mmwebext.dll?WSDL?server=localhost'
mmclient = Client(mmurl, plugins=[EnvelopeFixer()])
loginResult = mmclient.service[1].Login(u'localhost', u'user', u'pass')

создан следующий конверт:

<SOAP-ENV:Envelope xmlns:ns0="http://menandmice.com/webservices/" xmlns:ns1="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
   <SOAP-ENV:Header/>
   <ns1:Body>
      <ns0:Login>
         <ns0:server>localhost</ns0:server>
         <ns0:loginName>user</ns0:loginName>
         <ns0:password>pass</ns0:password>
      </ns0:Login>
   </ns1:Body>
</SOAP-ENV:Envelope>

, который возвращает:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <SOAP-ENV:Body>
      <SOAP-ENV:Fault>
         <faultcode>SOAP-ENV:Client</faultcode>
         <faultstring>Invalid command.</faultstring>
         <detail>
            <mmfaultdetails>
               <message>Invalid command.</message>
               <errorcode>5001</errorcode>
            </mmfaultdetails>
         </detail>
      </SOAP-ENV:Fault>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

но если я изменю его в soapUI на

<SOAP-ENV:Envelope xmlns:ns0="http://menandmice.com/webservices/" xmlns:ns1="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
   <SOAP-ENV:Header/>
   <SOAP-ENV:Body>
      <ns0:Login>
         <ns0:server>localhost</ns0:server>
         <ns0:loginName>user</ns0:loginName>
         <ns0:password>pass</ns0:password>
      </ns0:Login>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

успешно возвращается

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <SOAP-ENV:Body>
      <LoginResponse xmlns="http://menandmice.com/webservices/">
         <session>UEk6A0UC5bRJ92MqeLiU</session>
      </LoginResponse>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Итак, мой вопрос: могу ли я заставить suds создать тег body как <SOAP-ENV:Body> вместо <ns1:Body> или

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

class EnvelopeFixer(MessagePlugin):
    def sending(self, context):
        # context is the envelope text
        print type(context)
        context.envelope = context.envelope.upper()
        print context.envelope

        return context

Я изменил EnvelopeFixer, чтобы использовать маршалл вместо отправки, и это, похоже, сработало

class EnvelopeFixer(MessagePlugin):

    def marshalled(self, context):
        root = context.envelope.getRoot()
        envelope = root.getChild("Envelope")
        envelope.getChildren()[1].setPrefix("SOAP-ENV")
        print envelope.getChildren()[1]

        return context

Итак, теперь я изменил префикс элемента body, чтобы он соответствовал требованиям сервера. РАДОСТЬ!

1 Ответ

3 голосов
/ 06 января 2011

К сожалению, конечная точка RPC неправильно анализирует XML.Один из способов исправить это - добавить к вашему Client() плагин, который редактирует конверт перед отправкой. MessagePlugin дает вам возможность изменить suds.sax.document.Document или текст сообщения перед отправкой.

from suds.plugin import MessagePlugin
class EnvelopeFixer(MessagePlugin):
    def sending(self, context):
        # context is the envelope text
        context.envelope = context.envelope.upper()
        return context

client = Client(..., plugins=[EnvelopeFixer()])
...