以下是我编写的代码,用于验证用户登录凭据。使用.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
)。
请帮我解决这个问题。
谢谢。
答案 0 :(得分:60)
以下解决方案经过测试并用于 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的命名空间
现在使用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);
答案 1 :(得分:6)
来自@Azone的答案是不同的核心,但实际上,如果ksoap返回一个回复
预计START_TAG {...}信封(位置:START_TAG&lt; {...} ...
指的是需要与其使用的不同的东西。
因此,您需要为START_TAG&#34; soapenv&#34;使用相同的命名空间源代码。
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/";
答案 2 :(得分:3)
如果您使用了Azone的答案中描述的NAMESPACE
,URL
,SOAP_ACTION
和METHOD_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),在这种情况下,您不需要创建新服务 进化原来的。
答案 3 :(得分:1)
我弄清楚这个问题的答案是,在SOAP_ADDRESS字符串中,删除/ WebSiteName部分,它工作正常。我在我的Android设备上测试了这个。效果很好。
更正的字符串应如下所示:
private static final String SOAP_ADDRESS = "http://myStaticIP:portNo/CommunicationInterface.asmx";
其中CommunicationInterface.asmx是Web服务名称。 其他静态变量保持不变。
注意:在IIS中托管网站时使用此选项。