【问题标题】:ksoap2 org.xmlpull.v1.xmlpullparserexception expected start_tag errorksoap2 org.xmlpull.v1.xmlpullparserexception 预期的 start_tag 错误
【发布时间】:2012-09-07 22:48:21
【问题描述】:

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

请帮我解决这个问题。

谢谢。

【问题讨论】:

  • @zapl:你说那个朋友是什么意思.....
  • 我有同样的错误,发现它与我的代码无关。如果您在模拟器上运行,请重新启动您的工作环境并重试。您可能需要重复几次,但它最终对我有用!

标签: java android asp.net ksoap2 android-ksoap2


【解决方案1】:

如果您按照 Azone 的回答中所述使用了 NAMESPACEURLSOAP_ACTIONMETHOD_NAME 的值,但仍然出现错误,请检查中的 SOAP 版本本声明:

SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VERXX);

在我的例子中,我使用了SoapEnvelope.VER12,当我把它改回SoapEnvelope.VER11时,错误就解决了。

如何从 WSDL 中找到 SOAP 版本:

引用this answer:

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

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

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

【讨论】:

  • 我正在使用Version 11,但仍然出现此错误,请帮助我
【解决方案2】:

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

【讨论】:

  • 添加envelope.env = "http://schemas.xmlsoap.org/soap/envelope/"; 后,我仍然收到expected START_TAG... 错误...
  • @bbesase 您应该使用您在服务器上使用的相同“信封”配置 ksoap“信封”,不要复制和粘贴我的数据示例。如果您无权访问您的服务器,请使用soapUI 工具来确定您的“信封”
  • 使用wireshark和一些curl'ing到设备告诉我默认soapenv(xmlsoap)不正确,我需要设置它(到w3.org),如你所示。谢谢!
【解决方案3】:

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

那么您的代码可能无法访问网络服务,因为它没有提供正确的值

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

我费了很大劲才找到这些基本但重要的价值观来运行ksoap2

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

有很多例子实际上告诉了我这个值背后的理论,那就是如何生成它们 SOAP_ACTION = NAMESPACE + METHOD_NAME。

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

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

通过以下步骤后,您将永远不会遇到找出这些值的困难。

运行你的网络服务

1.网络服务

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

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.获取网址

查找字符串"soap:address location"

此属性的值将是您的网址

所以最终我们得到了所有需要的值。

根据我们的示例的值

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

看下面的sn-p

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 我需要有关 SOAP 的帮助。
  • @PiYusHGuPtA 好的,有什么帮助。我不是专业人士。一旦我在一个项目中实现了它。但我仍然想知道您在 SOAP 中面临什么类型的问题
  • @AZone 我已经用谷歌搜索并进行了大量搜索,我还检查了与它相关的所有 thignd,但我用过的一切都很完美。
  • @Solace 据我所知,他们有扩展名为.asmx的端点
  • @AZone 感谢您提供的信息。我的不是以.asmx 结尾,但您回答中的信息仍然非常有用。但是我检查了所有内容,一切都根据您在我的客户端程序中的答案,并且仍然出现错误。然后我意识到我使用的是错误版本的SoapEnvelope.VER12,将其更改为SoapEnvelope.VER11 并开始工作。所以我写了一个答案,我首先指出了这个答案,然后加了我的分。
【解决方案4】:

我认为这个问题的答案是,在 SOAP_ADDRESS 字符串中,删除 /WebSiteName 部分,它工作正常。我已经在我的 android 设备中对此进行了测试。完美运行。

修正后的字符串应该如下:

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

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

注意:这在网站托管在 IIS 中时使用。

【讨论】:

  • 我已经这样声明了private static final String URL = "http://my_system_ip:3908/WebService.asmx?";,但仍然无法消除错误
猜你喜欢
  • 1970-01-01
  • 2011-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多