So you want to spurn SOAP4r and http-access2 and espouse Ruby's builtin Net::HTTP class? But yes, it is strange how headers such as SOAPAction get munged into Soapaction and rejected by many SOAP toolkits. Don't spill yer chunky-bacon, try my quick and dirty work-round:
require 'rubygems'
require 'net/http'
require 'uri'
require 'builder'
endpoint = 'http://localhost:10080/'
soap = 'http://schemas.xmlsoap.org/soap/envelope/'
service = 'http://www.w3.org/2002/ws/databinding/examples/6/05/'
operation = "echoStringElement"
xml = Builder::XmlMarkup.new
xml.Envelope :xmlns => soap do
xml.Body do
xml.tag! operation, 'Be like the squirrel!', :xmlns => service
end
end
module Net
module HTTPHeader
def canonical( k )
return "SOAPAction" if k == 'soapaction'
k.split(/-/).map {|i| i.capitalize }.join('-')
end
end
end
uri = URI.parse(endpoint)
http = Net::HTTP.new(uri.host, uri.port)
#http.set_debug_output $stderr
req_headers= {
'Content-Type' => 'text/xml; charset=utf-8',
'SOAPAction' => '"' + service + '#' + operation + '"',
}
req_body = xml.target!
response = http.request_post(uri.path, req_body, req_headers)
puts response.body
Note I followed Sam's example and used XML::Builder to make the SOAP message. I now anticipate bile and vitriol from the apparently friendly, inclusive Ruby community :-)
Technorati Tags: HTTP, Ruby, SOAP, Web Services