mvantellingen / python-zeep

A Python SOAP client
http://docs.python-zeep.org
Other
1.88k stars 585 forks source link

Dealing with choice of possible value types for items #173

Closed FrugoFruit90 closed 8 years ago

FrugoFruit90 commented 8 years ago

First of all, thanks for fixing the issue #146 ! I am now able to create the client.

Now I would like to login and to do it I need a password and 2 items in login parameters: domain and login. Note that login parameters can be either stringValue or anyValue: ns1:paramValue(({stringValue: xsd:string} | {anyValue: {_value_1: ANY}}))

How should I pass arguments to the login function and how do I deal with the fact that loginParams can have either stringValue or anyValue (but not both)?

Performing -mzeep I found:

login(credentials: loginParams, password: xsd:string) -> xsd:string

So I tried putting credentials inside of a dictionary using the following code: client.service.login({"domain": "DOMAIN", "login": "LOGIN"}, "PASSWORD")

But it doesn't work (traceback below): Traceback (most recent call last): File "C:/Users/j.zysko/gabinet/dilo/utils.py", line 35, in <module> dilo_connect() File "C:/Users/j.zysko/gabinet/dilo/utils.py", line 30, in dilo_connect client.service.login({domain: domain, login: login}, password) File "C:\Users\j.zysko\Envs\gabinet\lib\site-packages\zeep\client.py", line 24, in __call__ self._op_name, args, kwargs) File "C:\Users\j.zysko\Envs\gabinet\lib\site-packages\zeep\wsdl\soap.py", line 92, in send return self.process_reply(client, operation_obj, response) File "C:\Users\j.zysko\Envs\gabinet\lib\site-packages\zeep\wsdl\soap.py", line 121, in process_reply return self.process_error(doc) File "C:\Users\j.zysko\Envs\gabinet\lib\site-packages\zeep\wsdl\soap.py", line 200, in process_error detail=fault_node.find('detail')) zeep.exceptions.Fault: org.apache.axis2.databinding.ADBException: Unexpected subelement {http://xml.kamsoft.pl/ws/kaas/login_types}item

The error message is the same as when I try to use the default request in SoapUI without deleting one of the options, so my guess is that this is what is causing the error.

Sorry, from documentation alone I was unable to understand if zeep doesn't allow this or is it simply my not using it well (though I do suspect the latter ;) )

The message below correctly performs the login operation through SoapUI:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:log="http://xml.kamsoft.pl/ws/kaas/login_types">
   <soapenv:Header/>
   <soapenv:Body>
      <log:login>
         <log:credentials>
            <!--1 or more repetitions:-->
            <log:item>
               <log:name>login</log:name>
               <log:value>
                  <!--You have a CHOICE of the next 2 items at this level-->
                  <log:stringValue>01090487380596</log:stringValue>
               </log:value>
            </log:item>
            <log:item>
               <log:name>domain</log:name>
               <log:value>
                  <!--You have a CHOICE of the next 2 items at this level-->
                  <log:stringValue>07</log:stringValue>
               </log:value>
            </log:item>

         </log:credentials>
         <log:password>AAAAAa1!</log:password>
      </log:login>
   </soapenv:Body>
</soapenv:Envelope>

This is the default request as generated by SoapUI:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:log="http://xml.kamsoft.pl/ws/kaas/login_types">
   <soapenv:Header/>
   <soapenv:Body>
      <log:login>
         <log:credentials>
            <!--1 or more repetitions:-->
            <log:item>
               <log:name>?</log:name>
               <log:value>
                  <!--You have a CHOICE of the next 2 items at this level-->
                  <log:stringValue>?</log:stringValue>
                  <log:anyValue>
                     <!--You may enter ANY elements at this point-->
                  </log:anyValue>
               </log:value>
            </log:item>
         </log:credentials>
         <log:password>?</log:password>
      </log:login>
   </soapenv:Body>
</soapenv:Envelope>

And below I run the -mzeep as you usually request :)

python -mzeep https://test-dilo.nfz.gov.pl/ws-broker-server-pkus-auth/services/Auth?wsdl --no-verify

Prefixes:
     ns0: http://xml.kamsoft.pl/ws/auth
     ns1: http://xml.kamsoft.pl/ws/kaas/login_types
     ns2: http://wsdl.kamsoft.pl/common
     ns3: http://xml.kamsoft.pl/ws/common
     xsd: http://www.w3.org/2001/XMLSchema

Global elements:
     ns3:authToken(id: xsd:string)
     ns3:authTokenError(location: location(), faultcode: xsd:string, faultstring: xsd:string, faultactor: xsd:string, messages: ArrayOfMessage)
     ns3:authenticationError(location: location(), faultcode: xsd:string, faultstring: xsd:string, faultactor: xsd:string, messages: ArrayOfMessage)
     ns3:authorizationError(location: location(), faultcode: xsd:string, faultstring: xsd:string, faultactor: xsd:string, messages: ArrayOfMessage)
     ns1:changePassword(credentials: loginParams, oldPassword: xsd:string, newPassword: xsd:string, newPasswordRepeat: xsd:string)
     ns1:changePasswordLog(credentials: loginParams, oldPassword: xsd:string, newPassword: xsd:string, newPasswordRepeat: xsd:string)
     ns1:changePasswordReturn(xsd:string)
     ns3:inputError(location: location(), faultcode: xsd:string, faultstring: xsd:string, faultactor: xsd:string, messages: ArrayOfMessage)
     ns3:location(namespace: xsd:string, localname: xsd:string, version: xsd:string, id: xsd:string)
     ns1:login(credentials: loginParams, password: xsd:string)
     ns1:loginReturn(xsd:string)
     ns1:logout(xsd:string)
     ns1:logoutReturn(xsd:string)
     ns3:passExpiredError(location: location(), faultcode: xsd:string, faultstring: xsd:string, faultactor: xsd:string, messages: ArrayOfMessage)
     ns3:serverError(location: location(), faultcode: xsd:string, faultstring: xsd:string, faultactor: xsd:string, messages: ArrayOfMessage)
     ns3:serviceError(location: location(), faultcode: xsd:string, faultstring: xsd:string, faultactor: xsd:string, messages: ArrayOfMessage)
     ns3:session(id: xsd:string)
     ns3:sessionError(location: location(), faultcode: xsd:string, faultstring: xsd:string, faultactor: xsd:string, messages: ArrayOfMessage)

Global types:
     ns3:ArrayOfMessage(Message: xsd:string[])
     ns3:AuthTokenException(location: location(), faultcode: xsd:string, faultstring: xsd:string, faultactor: xsd:string, messages: ArrayOfMessage)
     ns3:AuthenticationException(location: location(), faultcode: xsd:string, faultstring: xsd:string, faultactor: xsd:string, messages: ArrayOfMessage)
     ns3:AuthorizationException(location: location(), faultcode: xsd:string, faultstring: xsd:string, faultactor: xsd:string, messages: ArrayOfMessage)
     ns3:BaseException(location: location(), faultcode: xsd:string, faultstring: xsd:string, faultactor: xsd:string, messages: ArrayOfMessage)
     ns3:InputException(location: location(), faultcode: xsd:string, faultstring: xsd:string, faultactor: xsd:string, messages: ArrayOfMessage)
     ns3:PassExpiredException(location: location(), faultcode: xsd:string, faultstring: xsd:string, faultactor: xsd:string, messages: ArrayOfMessage)
     ns3:ServerException(location: location(), faultcode: xsd:string, faultstring: xsd:string, faultactor: xsd:string, messages: ArrayOfMessage)
     ns3:ServiceException(location: location(), faultcode: xsd:string, faultstring: xsd:string, faultactor: xsd:string, messages: ArrayOfMessage)
     ns3:ServiceLocation(namespace: xsd:string, localname: xsd:string, version: xsd:string, id: xsd:string)
     ns3:SessionException(location: location(), faultcode: xsd:string, faultstring: xsd:string, faultactor: xsd:string, messages: ArrayOfMessage)
     ns1:changePasswordParams(credentials: loginParams, oldPassword: xsd:string, newPassword: xsd:string, newPasswordRepeat: xsd:string)
     ns1:loginParam(name: xsd:string, value: paramValue)
     ns1:loginParams(item: loginParam[])
     ns1:loginRequest(credentials: loginParams, password: xsd:string)
     ns1:paramValue(({stringValue: xsd:string} | {anyValue: {_value_1: ANY}}))

Bindings:
     Soap11Binding: {http://xml.kamsoft.pl/ws/auth}AuthSoapBinding

Service: Auth
     Port: Auth (Soap11Binding: {http://xml.kamsoft.pl/ws/auth}AuthSoapBinding)
         Operations:
            changePassword(credentials: loginParams, oldPassword: xsd:string, newPassword: xsd:string, newPasswordRepeat: xsd:string, _soapheaders={session: session(), authToken: authToken()}) -> xsd:string
            changePasswordLog(credentials: loginParams, oldPassword: xsd:string, newPassword: xsd:string, newPasswordRepeat: xsd:string) -> xsd:string
            login(credentials: loginParams, password: xsd:string) -> xsd:string
            logout(xsd:string, _soapheaders={session: session(), authToken: authToken()}) -> xsd:string
FrugoFruit90 commented 8 years ago

As I suspected, it was just my incompetence, I tried a few things and it worked :+1: