Arihant Godha
Arihant Godha

Reputation: 2469

Ruby SOAP Client using SAVON not working whereas PHP SOAP client works

Hello there I am testing few web services and I am trying to write a client using SAVON with my WSDL. I have one available operation named log_process and I am trying to access that but getting errors. I have a similar script written in PHP and it is working fine. I have tried

require 'net/http'
require "uri"
require 'savon' 

client = Savon.client(wsdl: "http://somedomain.com/projects/shared/abc.wsdl")

@a=client.operations

puts @a
    
ary={0 =>"art", 1 =>"bac", 2 =>"arr"}
   
@result = client.call(:log_process, message:{0 =>"asdf", 1 =>"qwer", 2 =>"arr"})
puts @result

and getting following error

raise_soap_and_http_errors!': (SOAP-ENV:Client) Bad Request (Savon::SOAPFault)

My php working solution looks like this

$result = $client->log_process(array(0=>$user_name,1=>$user_pwd,2=>$display_type));

any idea what will be the ruby equivalent to this or am I calling the operation in correct manner?

Upvotes: 3

Views: 1641

Answers (2)

Randy Shelford
Randy Shelford

Reputation: 162

I know this is late, but I was having the exact same issue trying to set up a soap request using savon to a soap server I have worked with extensively using PHP Soap server. I found another post related to this, and it seem that adding the message_tag option fixed it.

This is because in my case the WSDL was expecting functionNameRequest in the xml, but savon as only sending funcionName by setting message_tag to functionNameRequest the >soap server was able to correctly map the function that was being requested.

This was the thread that helped me out https://github.com/savonrb/savon/issues/520 Relevant code quoted below:

Hi, I'm just sharing this in case it's useful.

I'm using savon 2.3.0 and I guess the gem had some problems identifying parameters >automatically from my wsdl. I have no idea about SOAP and this is the first time I'm >actually using it.

I'm dealing with TradeTracker's WSDL

With the following code I got it working:

client = Savon.client do
  wsdl "http://ws.tradetracker.com/soap/affiliate?wsdl"
  namespace_identifier :ns1
end

credentials = {
  customerID: 123123,
  passphrase: "123123123"
}

response = client.call(:authenticate, message_tag: :authenticate, message: credentials)

Upvotes: 2

jvanbaarsen
jvanbaarsen

Reputation: 339

Try:

@result = client.call(:log_process, message:["asdf", "asg", "arr"]) 

In the PHP code, you are sending only 1 parameter, its an array

Upvotes: 1

Related Questions