ksoap2 org.xmlpull.v1.xmlpullparserexception预计的start_tag错误

下面是我写的代码,用于validation用户login凭据。 使用.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 )。

请帮我解决这个问题。

谢谢。

下面的解决scheme经过testing并用于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来实际上感到沮丧,这些价值是什么,以及如何正确地得到它们。

通过以下程序后,您将永远无法find这些值。

运行您的WebService

1. WebService

它会告诉你一个这样的窗口给你。

图1 web服务

2. WSDL

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

它会看起来像这样。

图片2 wsdl

3.获取WebService的命名空间

现在使用Ctrl+Fsearchstring“ Namespace

你会得到这样的东西

图片3的命名空间

这里你会注意到我们有two namespaces

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

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

现在哪一个使用你会发现以后

4.获得方法名称及其相应的肥皂作用

在这种情况下寻找你想要访问"PutRecipeImagesPost"方法

图片4肥皂行动

你会看到这里有SOAP Action这个方法。

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

5.获取URL

查找string"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/"; 

如果您无法看到上述快照,或者无法获取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); 

@Azone的答案是多种多样的,但是,如果ksoap返回一个答案

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

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

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

ksoap2库使用默认的命名空间

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

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

龙卷风web服务的例子:

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

或者您需要将ksoapconfiguration为您的服务器的其他方式

服务器:

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

KSOAP:

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

如果您已经使用了Azone的答案中所述的NAMESPACEURLSOAP_ACTIONMETHOD_NAME的值,但仍然出现错误,请在此语句中检查SOAP版本

 SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VERXX); 

在我的情况下,我使用了SoapEnvelope.VER12 ,当我将其更改回SoapEnvelope.VER11 ,错误已解决。

如何从WSDL中findSOAP版本:

从这个答案引用:

SOAP 1.1使用名称空间http://schemas.xmlsoap.org/wsdl/soap/

SOAP 1.2使用名称空间http://schemas.xmlsoap.org/wsdl/soap12/

wsdl能够在同一个wsdl中同时在soap 1.1和soap 1.2下定义操作。 如果您需要发展您的wsdl以支持需要soap 1.2的新function(例如MTOM),那么这非常有用,在这种情况下,您不需要创build新的服务,只需要改进原来的服务即可。

这个问题的答案,我弄明白了,在SOAP_ADDRESSstring中,删除/ WebSiteName部分,它工作正常。 我已经testing了这个在我的Android设备。 完美的作品。

更正的string应如下所示:

 private static final String SOAP_ADDRESS = "http://myStaticIP:portNo/CommunicationInterface.asmx"; 

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

注意:这是在IIS中托pipe网站时使用的。