ksoap2 org.xmlpull.v1.xmlpullparserexception expected start_tag error

2022-09-04 05:01:27

以下是我的代码,我编写了该代码来验证用户登录凭据。使用 .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());
}



在排队我得到这句话"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/>

我不知道错误是什么。这段代码非常适合模拟器(更改)。staticIP to 10.0.2.2:portNo

请帮我解决这个问题。

谢谢。


答案 1

以下解决方案经过测试并用于 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)"

然后,您的代码可能无法访问 Web 服务,因为尚未为其提供正确的值

METHOD_NAME="";
NAMESPACE ="";      
SOAP_ACTION ="";
URL ="";

我花了很多努力来找到这些基本但重要的价值观来运行ksoap2

METHOD_NAME="";
NAMESPACE ="";      
SOAP_ACTION ="";
URL ="";

有各种各样的例子实际上告诉我这个值背后的理论,即如何像明智的SOAP_ACTION = NAMESPACE + METHOD_NAME一样生成它们。

我一直在尝试各种组合,但没有结果。

像我这样对WebServices和Ksoap2几乎没有经验并且大部分时间都使用JSON的人实际上感到沮丧,这些值到底是什么以及如何正确获取它们。

完成以下过程后,您将永远不会遇到查找这些值的困难。

运行您的 Web 服务

1. 网络服务

它会向你显示一个这样的窗口。

Picture 1 webservice

2. WSDL

现在打开其文件,方法是单击选择中标记的链接以查看其WSDLWSDL

它会看起来像这样。

picture 2 wsdl

3.To 获取 Web 服务的命名空间

现在搜索字符串 “” 使用NamespaceCtrl+F

你会得到这样的东西

picture 3 namespace

在这里,您会注意到我们有two namespaces

targetNamespace="http://tempuri.org/">
<wsdl:import namespace="iscservices.dedicated.co.za"

现在要考虑哪一个,我们将在以下步骤中找到

现在使用哪一个,你稍后会发现

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

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

Picture 4 Soap Action

您将看到这里也有此方法。SOAP Action

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

5. 获取网址

查找字符串"soap:address location"

see the picture below

此属性的值将是您的网址

因此,最终我们获得了所有必需的值。

根据我们的例子

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/";

如果您无法看到上述快照或无法获取这些快照的值,请告诉 修复此问题。WSDlWebService 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);

答案 2

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

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

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

因此,您需要对START_TAG“soapenv”使用相同的命名空间源

ksoap2 库使用默认命名空间

 xmlns:v="http://www.w3.org/2003/05/soap-envelope" 

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

龙卷风网络服务示例:

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

或者您需要将 ksoap 配置为服务器的其他方式

服务器:

self._envelope.setAttribute ('xmlns:soapenv', 'http://schemas.xmlsoap.org/soap/envelope/') 

ksoap:

envelope.env = "http://schemas.xmlsoap.org/soap/envelope/";