-->

ksoap2 org.xmlpull.v1.xmlpullparserexception预期STAR

2019-06-18 04:22发布

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

请帮我解决这个问题。

谢谢。

Answer 1:

下面测试溶液并使用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 ="";

有哪些actualy告诉我背后的理论这个值那如何生成它们像明智SOAP_ACTION = NAMESPACE + METHOD_NAME各种例子。

而且我一直在用,没有结果的各种组合试验。

像我这样的人谁是有与Web服务和Ksoap2一点经验和JSON已经woirked大部分时间实际上得到frustated,究竟发生了什么这些值以及如何正确得到它们。

你将永远不会面临去直通下面的步骤后发现这些值的困难。

运行您的WebService

1. WebService的

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

2. WSDL

现在,打开它的WSDL通过点击标志着挑的链接文件来看看它的WSDL

它将事情是这样的。

3.To获得命名空间为WebService

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

你会得到这样的事情

在这里,你会发现,我们有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

看看下面的代码片段

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);


Answer 2:

从@Azone答案是不同corect,但实际上,如果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')

或其他方式,你需要配置KSOAP为您的服务器

服务器:

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

KSOAP:

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


Answer 3:

如果您使用的值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同时,以限定下皂1.1和1.2肥皂操作。 如果您需要发展您的WSDL来支持,需要SOAP 1.2(如MTOM),在这种情况下,你不需要创建一个新的服务,但只是发展原来的新功能,那是有用的。



Answer 4:

这个问题的答案,因为我弄明白是,在SOAP_ADDRESS字符串这个问题,删除/ WebSiteName部分,它工作正常。 我在我的Android设备测试这一点。 完美的作品。

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

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

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

注:当网站在IIS托管时使用。



文章来源: ksoap2 org.xmlpull.v1.xmlpullparserexception expected start_tag error