簡體   English   中英

ksoap2 org.xmlpull.v1.xmlpullparserexception期望start_tag錯誤

[英]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

它將向您顯示這樣的窗口。

圖1 webservice

2. WSDL

現在通過單擊選擇中標記的鏈接打開其WSDL文件以查看其WSDL

它看起來像這樣。

圖片2 wsdl

3.獲取WebService的命名空間

現在使用Ctrl+F搜索字符串“ Namespace

你會得到這樣的東西

圖3命名空間

在這里,您會注意到我們有two namespaces

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

現在考慮哪一個我們將在后面的步驟中找到

現在使用哪一個你會發現

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

如果您無法在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的答案中描述的NAMESPACEURLSOAP_ACTIONMETHOD_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM