Android 使用KSOAP2调用WebService

soapObject=(SoapObject)envelope.getResponse();soapObject=(SoapObject)envelope.bodyIn;... soapObject = (SoapObject) envelope.getResponse(); soapObject = (SoapObject) envelope.bodyIn; 具体指啥意思? 区别、用法? 始终连接报错03-18 13:47:21.659: WARN/System.err(479): SoapFault - faultcode: 'soap:Client' faultstring: '�0�3�0�8�0�3�0�2�0�0�0�3�0�2�0�5¨�0�3�0�8�0�9è�0�3�0�5è�0�4�0�6�0�2�0�8�0�0 HTTP �0�2¤�0�7 SOAPAction �0�4�0�6�0�4�0�2�0�0�0�4: �0�0�0�0�0�2' faultactor: 'null' detail: org.kxml2.kdom.Node@437b25a0
03-18 13:47:21.670: WARN/System.err(479): at org.ksoap2.serialization.SoapSerializationEnvelope.parseBody(SoapSerializationEnvelope.java:112)
03-18 13:47:21.670: WARN/System.err(479): at org.ksoap2.SoapEnvelope.parse(SoapEnvelope.java:137)
展开
 我来答
匿名用户
2013-03-29
展开全部
android 利用ksoap2方式连接webservice(2010-04-16 16:36:25)转载标签:androidksoap2webserviceit 分类:Android
利用J2SE的ksoap2标准,我也来做一个山寨版本的android连接webservice。因为soap封装的关系,android application在接收到数据后不能够正确的按照J2SE的标准来获取。

在运用之前,我们先要引导两个jar进入工程的buildpath

这两个jar包都可以在网上查到下载,引导完后再做一项准备工作。弄清楚已发布的webservice的地址,以及封装的方式。比如:

webservice接口: http://192.168.0.2:8080/axis2/services/Manager?wsdl (顺便说明一下,在android当中,不能写localhost,必须写清楚PC机当前的网络IP)
webservice封装: http://ws.apache.org/axis2

都了解了过后,说明已经做好准备了。
下面就介绍一下android如何获取webservice封装数据。。

引入ksoap2中以封装好的类
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.AndroidHttpTransport;

在类中定义webservice的接口地址以及解析方式并且定义要调用的webservice中的函数
private static final String URL = " http://192.168.0.2:8080/axis2/services/Manager?wsdl";
private static final String NAMESPACE = " http://ws.apache.org/axis2";
private static final String METHOD_NAME = "GetMyFriends";

这个信息我们可以在webservice中查到
<xs:element name="GetMyFriends">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="userId" type="xs:int"/>
<xs:element minOccurs="0" name="password" nillable="true" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>

接下来开始做对webservice请求数据的工作,请求webservice函数以及封装要用的两个参数(userId和password)
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
request.addProperty("userId", "123456");
request.addProperty("password", "test");
之后我们给定义发送数据的信封的封装格式
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope( SoapEnvelope.VER11 );
发出请求
envelope.setOutputSoapObject(request);
AndroidHttpTransport aht = new AndroidHttpTransport(URL);
aht.call(null, envelope);

接着就可以定义一个SoapObject类型的实例去获取我们返回来的数据
SoapObject so = (SoapObject) envelope.bodyIn;
这里如果是返回来的数据只有一行并且只有一个值,比如验证函数,返回boolean类型的话,操作比较简单,String getReturn= so.getProperty("return"); 这个getReturn就是你要获取的值。
但是如果返回来是多行的值的话,这个方法就不行了,我们必须对返回来的信息做一些解析。我曾试过用J2SE的标准方式来获取,但是会报错,最主要的可能是他的方式在android当中不能使用。所以在这里我用了正则表达式这种方式来进行数据的解析,我们先来看一下他返回的数据的结构是什么情况。
GetMyFriendsResponse{return=FriendsMessage{ <br>permitList=anyType{nickName=我爱罗; singnature=null; userId=2; }; permitList=anyType{nickName=jack; singnature=null; userId=1004; }; permitList=anyType{nickName=admin; singnature=leo_admin; userId=1001; };};}
简单看他很想Json结构,但是确不是。。。
就目前的解决方式,我只是通过规律来进行了正则表达式的解析:如解析上面的内容。

//首先取得permitList(好友)的个数
String testPattern = "permitList";
int resultlength = result.length();
cresult = cresult.replace(testPattern, "");
int lastlength = (resultlength - cresult.length()) / testPattern.length();

//取得每个permitList中的值。
String LoginReturn="", pattern="nickName=.*?;\\s*singnature=.*?;\\s*userId=.*?;";
//动态生成String 数组,存储每个好友的信息
String[] GetFinalReturn = new String[lastlength];
for (int i=0;i<lastlength;i++){
LoginReturn = result.replaceFirst("^.*("+pattern+").*$", "$1");
GetFinalReturn[i] = LoginReturn;
result = result.replace(LoginReturn,"");
}
这个数组里面存储的格式就是nickName=admin; singnature=leo_admin; userId=1001;
这样以来,我们可以根据"="和";"两个符号之间做split操作就可以得到数据。

好了,到此连接webservice和解析返回来的数据的工作就做完了,虽然这个方式看起来很复杂,但是目前来说,用ksoap2方式来连接webservice暂时还没有找到更有效的解决方式。。
一诺千金丨
推荐于2016-09-17 · 知道合伙人数码行家
一诺千金丨
知道合伙人数码行家
采纳数:8766 获赞数:32842
1、专业生产电力检测设备,若要咨询相关直接向我咨询关于电力检测设备的问题吧。 2、武高电测最佳员工。

向TA提问 私信TA
展开全部
下是调用的几个主要的方法:
1.创建HttpTransportSE传输对象:HttpTransportSE ht = new HttpTransportSE(SERVICE_URL); SERVICE_URL是webservice提供服务的url
2.使用SOAP1.1协议创建Envelop对象:SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 设置SOAP协议的版本号,根据服务端WebService的版本号设置。
3.实例化SoapObject对象:SoapObject soapObject = new SoapObject(SERVICE_NAMESPACE, methodName); 第一个参数表示WebService的命名空间,可以从WSDL文档中找到WebService的命名空间。第二个参数表示要调用的WebService方法名。
4.设置调用方法的参数值,如果没有参数,可以省略:例如soapObject.addProperty("theCityCode", cityName);
5.记得设置bodyout属性 envelope.bodyOut = soapObject;
6.调用webservice:ht.call(SERVICE_NAMESPACE+methodName, envelope);
7.获取服务器响应返回的SOAP消息:
SoapObject result = (SoapObject) envelope.bodyIn;
SoapObject detail = (SoapObject) result.getProperty(methodName+"Result");
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
韶溪智尔琴
2019-03-04 · TA获得超过3659个赞
知道大有可为答主
回答量:3117
采纳率:32%
帮助的人:194万
展开全部
前一个是获得调用webservice返回的SOAP格式的数据,格式一般如下:
POST
/WebServices/ValidateCodeWebService.asmx
HTTP/1.1
Host:
www.webxml.com.cn
Content-Type:
text/xml;
charset=utf-8
Content-Length:
length
SOAPAction:
"http://WebXml.com.cn/enValidateImage"
<?xml
version="1.0"
encoding="utf-8"?>
<soap:Envelope
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<enValidateImage
xmlns="http://WebXml.com.cn/">
<byString>string</byString>
</enValidateImage>
</soap:Body>
</soap:Envelope>
后一个应该是获取上述内容中<soap:Body>标签中的内容。。。。
对于你所说的错误,我觉得可能是调用webservice方法时写的代码有问题,你仔细检查一下方法传递的参数以及参数的格式是否正确。。。。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式