ksoap2 org.xmlpull.v1.xmlpullparserexception期望start_tag错误

Cha*_*era 13 java asp.net android ksoap2 android-ksoap2

下面是我的代码,我用它来验证用户登录凭据.使用.net编写的Web服务

private static final String SOAP_ACTION = "http://tempuri.org/getCredentials";
private static final String OPERATION_NAME = "getCredentials";
private static final String WSDL_TARGET_NAMESPACE = "http://tempuri.org/";
private static final String SOAP_ADDRESS = "http://myStaticIP:portNo/WebSiteName/CommunicationInterface.asmx"; 

SoapObject request = new SoapObject(WSDL_TARGET_NAMESPACE, OPERATION_NAME);
request.addProperty("username",Username);
request.addProperty("password", Password);

SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet = true;
envelope.setOutputSoapObject(request);
HttpTransportSE httptransport = new HttpTransportSE(SOAP_ADDRESS);

try
{
    httptransport.call(SOAP_ACTION, envelope);
SoapPrimitive result = (SoapPrimitive) envelope.getResponse();
String value = result.toString();
value_LoginWS = value;
val = value;
login_status = Boolean.valueOf(result.toString());

Log.v("CS return value: -", result.toString());
return value;
}
catch (Exception e) 
{
     Log.v("Exception Soap" , e.toString());
}
Run Code Online (Sandbox Code Playgroud)



在行"httptransport.call(SOAP_ACTION, envelope)" 我得到的exception说法

"org.xmlpull.v1.XmlPullParserException: expected: START_TAG {http://schemas.xmlsoap.org/soap/envelope/}Envelope (position:START_TAG <html>
@1:7 in java.io.InputStreamReader@41afb3f0)" <br/><br/>
Run Code Online (Sandbox Code Playgroud)

我不知道错误是什么.这段代码完美适用于模拟器(更改staticIP to 10.0.2.2:portNo).

请帮我解决这个问题.

谢谢.

Del*_*019 60

下面的解决方案经过测试并用于WCF Web服务

如果您收到此错误

org.xmlpull.v1.XmlPullParserException: expected: START_TAG {http://schemas.xmlsoap.org/soap/envelope/}Envelope (position:START_TAG <html>
@1:7 in java.io.InputStreamReader@41afb3f0)"
Run Code Online (Sandbox Code Playgroud)

然后可能的机会是您的代码无法访问Web服务,因为它没有提供正确的值

METHOD_NAME="";
NAMESPACE ="";      
SOAP_ACTION ="";
URL ="";
Run Code Online (Sandbox Code Playgroud)

我努力寻找这些基本但重要的价值观 ksoap2

METHOD_NAME="";
NAMESPACE ="";      
SOAP_ACTION ="";
URL ="";
Run Code Online (Sandbox Code Playgroud)

有各种各样的例子,实际上告诉我这个价值背后的理论是如何像智慧的SOAP_ACTION = NAMESPACE + METHOD_NAME那样生成它们.

我一直在试验各种没有结果的组合.

像我这样对WebServices和Ksoap2缺乏经验并且大部分时间都在使用JSON的人实际上感到沮丧,这些值是什么以及如何正确地得到它们.

通过以下程序后,您将永远不会遇到找出这些值的困难.

运行WebService

1. WebService

它将向您显示这样的窗口.

图1 webservice

2. WSDL

现在WSDL通过单击选择中标记的链接打开其文件来查看它WSDL

它看起来像这样.

图片2 wsdl

3.获取WebService的命名空间

现在使用搜索字符串" Namespace"Ctrl+F

你会得到这样的东西

图3命名空间

在这里你会发现我们有 two namespaces

targetNamespace="http://tempuri.org/">
<wsdl:import namespace="iscservices.dedicated.co.za"
Run Code Online (Sandbox Code Playgroud)

现在考虑哪一个我们将在后面的步骤中找到

现在使用哪一个你会发现

4.获取方法名称及其相应的SoapAction

"PutRecipeImagesPost"在这种情况下,查找您要访问的方法

图4肥皂行动

你会看到这里SOAP Action也有这种方法.

就像在Soap action is NameSpace + Methodname 这里我们可以看到它的使用"iscservices.dedicated.co.za" 所以我们将最终确定为我们的namespace

5.获取URL

寻找字符串 "soap:address location"

见下图

该属性的值将是您的URL

所以最终我们得到了所有必需的值.

根据我们的例子的价值观

METHOD_NAME="PutRecipeImagesPost";
NAMESPACE ="iscservices.dedicated.co.za";       
SOAP_ACTION ="iscservices.dedicated.co.za/InterfaceiPhysioIntelWCFService/PutRecipeImagesPost";
URL ="http://10.0.2.2:51809/iPhysioIntelService.svc/second/";
Run Code Online (Sandbox Code Playgroud)

如果您无法看到上述快照或无法获取这些快照的值,请WSDl告诉其 WebService deveoper解决此问题.

后来如何使用KSoap2

请参阅下面的代码段

SoapObject req = new SoapObject(NAMESPACE,METHOD_NAME);
            //SoapObject req = new SoapObject(Namespace_Server,MethodName_Server);

    //req.addProperty(KEY, VALUE);
//Key : - parameter name that is there in URL of webservice
//value:- value we want to send to the parameter
    req.addProperty("ImageData", data);
    req.addProperty("login", CommonStaticData.getusername());
    req.addProperty("password",CommonStaticData.getpassword());
    req.addProperty("recipeId",FileID);

    MarshalBase64 mbase = new MarshalBase64();// marshal is used to serialize the byte array

    SoapSerializationEnvelope envelop = new SoapSerializationEnvelope(SoapEnvelope.VER11);
    envelop.bodyOut = req;
    envelop.encodingStyle = SoapSerializationEnvelope.ENC2001;
    envelop.dotNet = true;
    envelop.setOutputSoapObject(req);


    HttpTransportSE aht = new HttpTransportSE(URL);

    mbase.register(envelop);


    aht.call(SOAP_ACTION,envelop);
Run Code Online (Sandbox Code Playgroud)

  • 最好的答案! (3认同)
  • @Solace据我所知,他们的扩展名为.asmx` (2认同)
  • @AZone感谢您提供的信息.我的结尾不是`.asmx`,但你答案中的信息仍然非常有用.但我检查了一切,一切都是根据你在我的客户端程序中的答案,并仍然得到错误.然后我意识到我正在使用`SoapEnvelope.VER12`这是错误的版本,将其更改为`SoapEnvelope.VER11`并开始工作.所以我写了一个答案,我首先指出了这个答案然后加了我的分. (2认同)

RTO*_*kit 6

来自@Azone的答案是不同的核心,但实际上,如果ksoap返回答案为

预计START_TAG {...}信封(位置:START_TAG <{...} ...

指的是需要与它使用的不同的东西.

所以你需要为START_TAG"soapenv"使用相同的命名空间源代码

ksoap2库使用默认命名空间

 xmlns:v="http://www.w3.org/2003/05/soap-envelope" 
Run Code Online (Sandbox Code Playgroud)

所以你的服务器应保持相同的来源

tornado-webservices示例:

self._envelope.setAttribute ('xmlns:soapenv', 'http://www.w3.org/2003/05/soap-envelope')
Run Code Online (Sandbox Code Playgroud)

或者您需要将ksoap配置为服务器的另一种方式

服务器:

self._envelope.setAttribute ('xmlns:soapenv', 'http://schemas.xmlsoap.org/soap/envelope/') 
Run Code Online (Sandbox Code Playgroud)

KSOAP:

envelope.env = "http://schemas.xmlsoap.org/soap/envelope/";
Run Code Online (Sandbox Code Playgroud)


Cha*_*era 1

我发现这个问题的答案是,在 SOAP_ADDRESS 字符串中,删除 /WebSiteName 部分,它就可以正常工作。我已经在我的 Android 设备上对此进行了测试。工作完美。

更正后的字符串应如下所示:

private static final String SOAP_ADDRESS = "http://myStaticIP:portNo/CommunicationInterface.asmx";
Run Code Online (Sandbox Code Playgroud)

其中 CommunicationInterface.asmx 是 Web 服务名称。其他静态变量保持不变。

注意:当网站托管在 IIS 中时使用此选项。