欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

android中soap协议使用(ksoap调用webservice)

程序员文章站 2023-11-08 14:57:46
如下面代码所示: 复制代码 代码如下:soapobject request  = new soapobject(servicenamespace, methodn...

如下面代码所示:

复制代码 代码如下:

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工作,否则会堵塞操作。