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
它会告诉你一个这样的窗口给你。
2. WSDL
现在通过单击选中标记的链接来查看它的WSDL
来打开它的WSDL
文件
它会看起来像这样。
3.获取WebService的命名空间
现在使用Ctrl+F
searchstring“ Namespace
”
你会得到这样的东西
这里你会注意到我们有two namespaces
targetNamespace="http://tempuri.org/"> <wsdl:import namespace="iscservices.dedicated.co.za"
现在考虑哪一个,我们将在后面的步骤中find
现在哪一个使用你会发现以后
4.获得方法名称及其相应的肥皂作用
在这种情况下寻找你想要访问"PutRecipeImagesPost"
方法
你会看到这里有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的答案中所述的NAMESPACE
, URL
, SOAP_ACTION
和METHOD_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网站时使用的。