2010-05-24 99 views
1

我正尝试在Android手机上使用kSOAP2访问Webservice。我认为连接正在建立,但服务器不会回答我的请求,因为我没有提供似乎在SOAP Version 1.1中需要的SOAP Action Header(如果我在这里错误,请纠正我),我有使用,因为服务器不支持版本1.2。 这是在请求中返回的具体Fault代码看起来是这样的:Android上的kSOAP2和SOAPAction

faultactor null  
faultcode "S:Server" (id=830064966432)  
faultstring "String index out of range: -11" (id=830064966736) 

这是服务器(我运行它在本地主机)上生成的错误代码如下所示:

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) 

在WSDL的相关部分(至少这是我在想什么)看起来是这样的:

<operation name="createContext"> 
<soap:operation soapAction=""/> 
− 
<input> 
<soap:body use="literal" namespace="http://server.contextlayer.bscwi.de/"/> 
</input> 
− 
<output> 
<soap:body use="literal" namespace="http://server.contextlayer.bscwi.de/"/> 
</output> 
</operation>  

在我的代码,我加入了头,但它好像我做错了:

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(); 

,因为我跑出来的想法.. 感谢乡亲任何意见将是巨大的!

回答

12

SOAP Action由名称空间和您想要调用的实际方法组成。

另外,SOAP Action需要封装在“”中才能工作。我有一个类似的错误,直到我用辅助方法来生成我的SOAP Action:

public String getSoapAction(String method) { 
    return "\"" + NAMESPACE + method + "\""; 
} 

我希望它有帮助!

+0

没有看到这个问题已近两年了..我希望别人对此答案感到高兴...... – htz 2012-05-10 07:32:45