title: Why is "wsdl" namespace interjected into action name when using savon for ruby soap communication?
body: <p>I'm trying to access a SOAP service I don't control. One of the actions is called <code>ProcessMessage</code>. I followed the example and generated a SOAP request, but I got an error back saying that the action doesn't exist. I traced the problem to the way the body of the envelope is generated. </p>
  
  <pre><code>&lt;env:Envelope ... "&gt;
      &lt;env:Header&gt;
          &lt;wsse:Security ... "&gt;
              &lt;wsse:UsernameToken ..."&gt;
                  &lt;wsse:Username&gt;USER&lt;/wsse:Username&gt;
                      &lt;wsse:Nonce&gt;658e702d5feff1777a6c741847239eb5d6d86e48&lt;/wsse:Nonce&gt;
                      &lt;wsu:Created&gt;2010-02-18T02:05:25Z&lt;/wsu:Created&gt;
                      &lt;wsse:Password ... &gt;password&lt;/wsse:Password&gt;
              &lt;/wsse:UsernameToken&gt;
          &lt;/wsse:Security&gt;
      &lt;/env:Header&gt;
      &lt;env:Body&gt;
          &lt;wsdl:ProcessMessage&gt;
              &lt;payload&gt;
                  ......
              &lt;/payload&gt;
          &lt;/wsdl:ProcessMessage&gt;
      &lt;/env:Body&gt;
  &lt;/env:Envelope&gt;     
  </code></pre>
  
  <p>That <code>ProcessMessage</code> tag should be:</p>
  
  <pre><code>    &lt;ProcessMessage xmlns="http://www.starstandards.org/webservices/2005/10/transport"&gt;
  </code></pre>
  
  <p>That's what it is when it is generated by the sample Java app, and it works. That tag is the only difference between what my Ruby app generates and the sample Java app.  Is there any way to get rid of the <code>"wsdl:"</code> namespace in front of that one tag and add an attribute like that. Barring that, is there a way to force the action to be not to be generated by just passed as a string like the rest of the body? </p>
  
  <p>Here is my code:</p>
  
  <pre><code>require 'rubygems'
  require 'savon'
  client = Savon::Client.new "https://gmservices.pp.gm.com/ProcessMessage?wsdl"
  
  response = client.process_message! do | soap, wsse |
  wsse.username = "USER"
  wsse.password = "password"
  soap.namespace = "http://www.starstandards.org/webservices/2005/10/transport" #makes no difference
  soap.action = "ProcessMessage" #makes no difference
  soap.input = "ProcessMessage" #makes no difference
  
  #my body at this point is jsut one big xml string
  
  soap.body = "&lt;payload&gt;...&lt;/payload&gt;" 
  # putting &lt;ProccessMessage&gt; tag here doesn't help as it just creates a duplicate tag in the body, since Savon keeps interjecting  &lt;wsdl:ProcessMessage&gt; tag.
  
    end
  </code></pre>
  
  <p>I tried handsoap but it doesn't support HTTPS and is confusing. I tried soap4r but but it's even more confusing than handsoap.</p>