![](/img/trans.png)
[英]“org.xmlpull.v1.XmlPullParserException: expected: START_TAG” error
[英]ksoap2 org.xmlpull.v1.xmlpullparserexception expected start_tag error
下面是我的代碼,我用它來驗證用戶登錄憑據。 使用.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
更改staticIP to 10.0.2.2:portNo
)。
請幫我解決這個問題。
謝謝。
下面的解決方案經過測試並用於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的人實際上感到沮喪,這些值是什么以及如何正確地獲取它們。
通過以下程序后,您將永遠不會遇到找出這些值的困難。
運行WebService
1. WebService
它將向您顯示這樣的窗口。
2. WSDL
現在通過單擊選擇中標記的鏈接打開其WSDL
文件以查看其WSDL
它看起來像這樣。
3.獲取WebService的命名空間
現在使用Ctrl+F
搜索字符串“ Namespace
”
你會得到這樣的東西
在這里,您會注意到我們有two namespaces
targetNamespace="http://tempuri.org/">
<wsdl:import namespace="iscservices.dedicated.co.za"
現在考慮哪一個我們將在后面的步驟中找到
現在使用哪一個你會發現
4.獲取方法名稱及其相應的SoapAction
在這種情況下,查找要訪問"PutRecipeImagesPost"
方法
您將在此處看到此方法還有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/";
如果您無法在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"
所以你的服務器應該保持相同的來源
tornado-webservices示例:
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/";
如果您使用了Azone的答案中描述的NAMESPACE
, URL
, SOAP_ACTION
和METHOD_NAME
的值但仍然收到錯誤,請在此語句中檢查SOAP的版本 :
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VERXX);
在我的情況下,我使用了SoapEnvelope.VER12
,當我將其更改回SoapEnvelope.VER11
,錯誤得到了解決。
如何從WSDL中找到SOAP版本:
引用這個答案 :
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(例如MTOM)的新功能,那么這很有用,在這種情況下,您不需要創建新服務,而只需要改進原始服務。
我弄清楚這個問題的答案是,在SOAP_ADDRESS字符串中,刪除/ WebSiteName部分,它工作正常。 我在我的Android設備上測試了這個。 完美的工作。
更正的字符串應如下所示:
private static final String SOAP_ADDRESS = "http://myStaticIP:portNo/CommunicationInterface.asmx";
其中CommunicationInterface.asmx是Web服務名稱。 其他靜態變量保持不變。
注意:在IIS中承載網站時使用此選項。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.