android - Android 上的 kSOAP2 和 SOAPAction

标签 android action ksoap2

我正在尝试在 Android 手机上使用 kSOAP2 访问 Web 服务。我认为连接正在建立,但服务器不会回答我的请求,因为我没有提供 SOAP 版本 1.1 中似乎需要的 SOAP 操作 header (如果我在这里错了,请纠正我)我有使用,因为服务器不支持版本 1.2。 请求中返回的具体 Faultcode 如下所示:

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>    

在我的代码中,我添加了一个 header ,但似乎我做错了:

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

任何建议都会很棒,因为我的想法已经用完了.. 谢谢大家!

最佳答案

SOAP 操作由命名空间和您要调用的实际方法组成。

另外,SOAP Action需要封装在""中才能发挥作用。我有一个类似的错误,直到我使用辅助方法生成我的 SOAP 操作:

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

希望对您有所帮助!

关于android - Android 上的 kSOAP2 和 SOAPAction,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2899392/

相关文章:

node.js - 如果前端使用 SSL,Nodejs 是否需要额外的安全措施?

android - 比较在 Android 中使用 SHA-1 生成的两个哈希字符串

android - KSOAP 永不超时

android - 如何查看android静态库的ABI?

java - 这一行应该是什么? ( java )

php - 表单上的单独提交按钮告诉表单 "action"发布到不同的文件?

php - wordpress 中的 add_action 函数

Android 从 Android 设置导航回应用程序

java - 在 Android Studio 中使用 Netbeans 的 JDK

ksoap2 - 如何解析 soapfault 的细节?