android中soap协议使用(ksoap调用webservice)
如下面代码所示:
soapobject request = new soapobject(servicenamespace, methodname);
soapobject构造函数的两个参数含义为:
servicenamespace – 你的webservice的命名空间,既可以是
http://localhost:8088/flickrbuddy/services/buddycast这样的,也可以是 urn:pi/devcentral/soapservice这样的;
methodname – 你要调用方法的名字。
然后,按照webservice方法参数的顺序,依次调用
request.addproperty( "username", "user" );
request.addproperty( "password", "pass" );
来填充webservice参数。
注意:
建议webservice的方法传递的参数尽量用string类型。即使是int类型,ksoap2与java编写的webservice也有可能交互发生异常。
对于webservice方法返回string类型的情况,还用不着开发者做序列化(serialization)定制工作。
要点:
ksoap 1.x/2.0可以自动把四种soap类型映射为java类型
soap type java type
xsd:int java.lang.integer
xsd:long java.lang.long
xsd:string java.lang.string
xsd:boolean java.lang.boolean
除此之外,都需要开发者自己做类型映射。
然后要告诉soapserializationenvelope把构造好的soapobject封装进去:
soapserializationenvelope envelope =
new soapserializationenvelope(soapenvelope.ver11);
envelope.bodyout = request;
要点:
你可以通过soapserializationenvelope或者soapenvelope的构造函数来指明你要用soap的哪一个规范,可以是以下几种之一:
常量soapenvelope.ver10:对应于soap 1.0规范
常量soapenvelope.ver11:对应于soap 1.1规范
常量soapenvelope.ver12:对应于soap 1.2规范
这样,无论要调用的webservice采用了哪一个soap规范,你都可以轻松应对。
接下来就要声明
httptransport tx = new httptransport(serviceurl);
ht.debug = true;
httptransport构造函数的参数含义为:
serviceurl – 要投递soap数据的目标地址,譬如说
http://soap.amazon.com/onca/soap3 。
httptransport是一个强大的辅助类,来完成http-call transport process,它封装了网络请求的一切,你完全不用考虑序列化消息。我们通过设置它的debug属性为true来打开调试信息。
方法httptransport.call()自己就能够发送请求给服务器、接收服务器响应并序列化soap消息,如下所示:
ht.call(null, envelope);
httptransport的call方法的两个参数含义为:
soapaction – soap 规范定义了一个名为 soapaction 的新 http 标头,所有 soap http 请求(即使是空的)都必须包含该标头。 soapaction 标头旨在表明该消息的意图。通常可以置此参数为null,这样httptransport就会设置http标头soapaction为空字符串。
envelope – 就是前面我们构造好的soapserializationenvelope或soapenvelope对象。
注意:
对于httptransport的处理上,ksoap2和ksoap1.2的写法不一样。
对于ksoap 1.2,httptransport的构造函数是httptransport (string url, string soapaction),第二个参数soapaction可以是要调用的webservice方法名。
而ksoap 2,构造函数是 httptransport(string url)。ksoap2相当于把webservice方法名分离出去,完全交给soapobject去封装,而httptransport仅仅负责把 soapenvelope发送出去并接收响应,这样更合理一些。
调用call方法是一个同步过程,需要等待它返回。
返回之后,就可以调用soapserializationenvelope的getresult方法来获取结果了:
object response = envelope.getresult();
如果httptransport的debug属性为true,那么此时就可以通过
system.out.println("response dump>>" + tx.responsedump);
打印出httptransport的调试信息。尤其当前面call方法和getresult方法发生异常时,这个调试信息是非常有用的。
前面我们的webservice方法由于是返回string,所以得到这个string值就非常简单了:
string sresponse = (string)response;
注意:
由于httptransport类实际上是调用了httpconnection作网络连接,所以必须另起一个线程来专门做ksoap工作,否则会堵塞操作。
上一篇: 樱桃作用今天告诉你