Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Change web service url for a suds client on runtime (keeping the wsdl)

Tags:

python

wsdl

suds

First of all, my question is similar to this one

But it's a little bit different. What we have is a series of environments, with the same set of services. For some environments (the local ones) we can get access to the wsdl, and thus generating the suds client. For external environment, we cannot access the wsdl. But being the same, I was hoping I can change just the URL without regenerating the client. I've tried cloning the client, but it doesn't work.


Edit: adding code:

    host='http://.../MyService.svc'
    wsdl_file = 'file://..../wsdl/MyService.wsdl'

    client = suds.client.Client(wsdl_file, location=host, cache=None)

    #client = baseclient.clone()

    #client.options.location = otherhost

    client.set_options(port='BasicHttpBinding_IMyService')

    result = client.service.IsHealthy()

That gives me this exception:

The message with Action 'http://tempuri.org/IMyService/IsHealthy' cannot be processed at the receiver, due to a ContractFilter mismatch at the EndpointDispatcher. This may be because of either a contract mismatch (mismatched Actions between sender and receiver) or a binding/security mismatch between the sender and the receiver. Check that sender and receiver have the same contract and the same binding (including security requirements, e.g. Message, Transport, None).

The thing is, if I set the client directly to the host, it works fine: client = suds.client.Client(host)

As you can see, I've tried cloning the client, but with the same exception. I even tried this:

    baseclient = suds.client.Client(host)

    client = baseclient.clone()

    client.options.location = otherhost
    ....

And got the same exception.

Anyone can help me?

like image 923
patanpatan Avatar asked May 14 '10 17:05

patanpatan


2 Answers

client.sd[0].service.setlocation(new_url)

...is the "manual" way, ie. per service-description.

client.set_option(new_url)

...should also work, per the author.

options is a wrapped/protected attr -- direct edits may very well be ignored.

like image 159
anthonyrisinger Avatar answered Nov 09 '22 02:11

anthonyrisinger


I've got it!. I don't even know how I've figured it out, but with a little of guessing and a much of luck I ended up with this:

    wsdl_file = 'file://...../MyService.wsdl'

    client = suds.client.Client(wsdl_file)
    client.wsdl.url = host #this line did the trick

    client.set_options(port='BasicHttpBinding_IMyService')

    result = client.service.IsHealthy()

And it works! I can't find any documentation about that property (client.wsdl.url), but it works, so I post it in case someone have the same problem.

like image 43
patanpatan Avatar answered Nov 09 '22 02:11

patanpatan