title: kSOAP2 and SOAPAction on Android
body: <p>I am trying to access a Webservice with kSOAP2 on an Android Phone. I think the connection is being established, but the server won't answer my request since I'm not providing a SOAP Action Header which seems to be required in SOAP Version 1.1(please correct me if I'm wrong here) which I have to use since the server does not support Version 1.2 .
  The concrete Faultcode which is returning in the request looks like this:</p>
  
  <pre><code>faultactor  null    
  faultcode   "S:Server" (id=830064966432)    
  faultstring "String index out of range: -11" (id=830064966736)
  </code></pre>
  
  <p>The errorcode which is generated on the server (I'm running it on a localhost) looks like this:</p>
  
  <pre><code>4.05.2010 20:20:29 com.sun.xml.internal.ws.transport.http.HttpAdapter fixQuotesAroundSoapAction
  WARNUNG: Received WS-I BP non-conformant Unquoted SoapAction HTTP header: http://server.contextlayer.bscwi.de/createContext
  24.05.2010 20:20:29 com.sun.xml.internal.ws.server.sei.EndpointMethodHandler invoke
  SCHWERWIEGEND: String index out of range: -11
  java.lang.StringIndexOutOfBoundsException: String index out of range: -11
      at java.lang.String.substring(Unknown Source)
      at de.bscwi.contextlayer.xml.XmlValidator.isValid(XmlValidator.java:41)
      at de.bscwi.contextlayer.server.ContextWS.createContext(ContextWS.java:45)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
      at java.lang.reflect.Method.invoke(Unknown Source)
      at com.sun.xml.internal.ws.api.server.InstanceResolver$1.invoke(Unknown Source)
      at com.sun.xml.internal.ws.server.InvokerTube$2.invoke(Unknown Source)
      at com.sun.xml.internal.ws.server.sei.EndpointMethodHandler.invoke(Unknown Source)
      at com.sun.xml.internal.ws.server.sei.SEIInvokerTube.processRequest(Unknown Source)
      at com.sun.xml.internal.ws.api.pipe.Fiber.__doRun(Unknown Source)
      at com.sun.xml.internal.ws.api.pipe.Fiber._doRun(Unknown Source)
      at com.sun.xml.internal.ws.api.pipe.Fiber.doRun(Unknown Source)
      at com.sun.xml.internal.ws.api.pipe.Fiber.runSync(Unknown Source)
      at com.sun.xml.internal.ws.server.WSEndpointImpl$2.process(Unknown Source)
      at com.sun.xml.internal.ws.transport.http.HttpAdapter$HttpToolkit.handle(Unknown Source)
      at com.sun.xml.internal.ws.transport.http.HttpAdapter.handle(Unknown Source)
      at com.sun.xml.internal.ws.transport.http.server.WSHttpHandler.handleExchange(Unknown Source)
      at com.sun.xml.internal.ws.transport.http.server.WSHttpHandler.handle(Unknown Source)
      at com.sun.net.httpserver.Filter$Chain.doFilter(Unknown Source)
      at sun.net.httpserver.AuthFilter.doFilter(Unknown Source)
      at com.sun.net.httpserver.Filter$Chain.doFilter(Unknown Source)
      at sun.net.httpserver.ServerImpl$Exchange$LinkHandler.handle(Unknown Source)
      at com.sun.net.httpserver.Filter$Chain.doFilter(Unknown Source)
      at sun.net.httpserver.ServerImpl$Exchange.run(Unknown Source)
      at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
      at java.lang.Thread.run(Unknown Source)
  </code></pre>
  
  <p>The relevant part of the WSDL (at least that's what I'm thinking) looks like this:</p>
  
  <pre><code>&lt;operation name="createContext"&gt;
  &lt;soap:operation soapAction=""/&gt;
  −
  &lt;input&gt;
  &lt;soap:body use="literal" namespace="http://server.contextlayer.bscwi.de/"/&gt;
  &lt;/input&gt;
  −
  &lt;output&gt;
  &lt;soap:body use="literal" namespace="http://server.contextlayer.bscwi.de/"/&gt;
  &lt;/output&gt;
  &lt;/operation&gt;    
  </code></pre>
  
  <p>In my code I'm adding a Header, but it seems like I'm doing it wrong:</p>
  
  <pre><code>private static final String SOAP_ACTION  = "";
  //...
  SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope (SoapEnvelope.VER11);
  soapEnvelope.setOutputSoapObject(Request);
  AndroidHttpTransport aht = new AndroidHttpTransport (URL);
  //...
  aht.call(SOAP_ACTION, soapEnvelope);
          SoapPrimitive resultString = (SoapPrimitive) soapEnvelope.getResponse();
  </code></pre>
  
  <p>Any advice would be great since I'm running out of ideas..
  Thanks folks!</p>