因工作需要,最近需要通过java调用webservice的方法拿数据. 我是第一次接触,然后大概看了下webservice说明,以为就是个别的网站提供的接口,我只要访问那个连接将参数传递过去就可以了,于是我用手敲了下试试(就是地址栏以get形式提交参数),然后发现不是这样用的...然后又仔细看了些说明,才知道是怎么使用的,看网上有资料说有很多方法可以实现,我这里介绍一下我实现所使用的方法. 首先需要导入四个jar包,下载地址是 http://download.csdn.net/detail/c5906343/7592183 ! c" t* l" k6 m# P( Q" d" O) O" Z0 ]
然后就是代码实现 webservice方法的样子如下 2 K& j$ u! ? z& r/ R6 T. \
[html] view plaincopy
/ I" W7 q' Z: n2 u: U* _6 R4 m0 N" D5 D
( ]! [; P. t/ F2 z3 p/ U: U- <soap:Body>
- <validate xmlns="http://abc.org/">
- <a>string</ssoTokenId>
- <b>string</appId>
- <c>int</detail>
- </validate>
- </soap:Body>
" }% Z$ d8 f- `5 J: m$ k1 {7 K& }2 T
. a$ N# s, P. p$ \" F0 ^; S! l7 ?# M. a/ M
对应的Java实现方式如下
; d3 ]2 \6 O# U& }
; V D5 ~/ I% k7 p9 s0 x8 p8 n[java] view plaincopy
1 V- c0 e6 {# {
1 h5 g: J" S4 m2 X0 k* j( |
6 @& b W, I" w% Q( @% k' z- String url = "http://192.168.1.16/pdmservice/Service1.asmx";
- String xmlns = "http://abc.org/";
- Service service = new Service();
- Call call = (Call) service.createCall();
- call.setTargetEndpointAddress(url);//设置webservice路径
- call.setOperationName(new QName(xmlns,"validate"));//设置要调用的方法名
- call.addParameter(new QName(xmlns,"a"), javax.xml.rpc.encoding.XMLType.XSD_STRING,javax.xml.rpc.ParameterMode.IN);//接口的参数
- call.addParameter(new QName(xmlns,"b"), javax.xml.rpc.encoding.XMLType.XSD_STRING,javax.xml.rpc.ParameterMode.IN);//接口的参数
- call.addParameter(new QName(xmlns,"c"), javax.xml.rpc.encoding.XMLType.XSD_INT,javax.xml.rpc.ParameterMode.IN);//接口的参数
- call.setReturnType(javax.xml.rpc.encoding.XMLType.XSD_STRING);//设置返回类型为String类型
- String result = (String)call.invoke(new Object[]{"val1","val2","2014"});//获得接口返回的值,这里注意的是,就算参数为int类型,传参时也应为字符串 ' L0 P* H2 {$ j: T' {( b3 Q
. _9 {- m' e8 L: U4 S$ E2 W$ c$ i3 i/ O; f, a1 [
2 O. _1 O" ]1 h4 H
说一下我遇到的问题 我是通过Java访问的.net的webservice,刚开始会有一个异常,是因为.net中少了一句声明,加上就没问题了 然后就是刚开始添加参数的时候是这么用的
8 w" T9 z1 C+ U9 k5 J- V[java] view plaincopy
' c4 J( I, [# a- D7 K, ~7 @
! W5 L7 L% w( q# h8 @/ `
( X$ l3 v+ v w6 C9 a1 _# X9 M# J( H- call.addParameter("a", javax.xml.rpc.encoding.XMLType.XSD_STRING,javax.xml.rpc.ParameterMode.IN);
# h) A7 m- u- A + |. i: d) v2 \2 x7 o/ U
这样使用的话是不行的,参数会传递不到webservice,导致webservice接收不到参数/ p( p& T. c+ V4 [1 g0 i( ?: r
还有我刚开始传递int类型的值时是 [java] view plaincopy
, t, p# {4 N: j1 S# W- `6 f1 Q: X$ M: L5 v4 M
% E. X* K e$ l7 g: R- new Object[]{"val1","val2",2014}
5 D5 `* |) W+ f- ^: O" d
& _0 h/ l. [2 e$ I# V
/ c7 n, a9 ]4 y0 Q/ t. K赋值的int类型的数据,这样也是不行的,需要把int转换为字符串传递才可以 0 v# g# m! \4 O ^* L2 {" ^
就这么短短的几句话就可以实现调用webservice的方法了,其实挺简单的,就是第一次接触,在我遇到的问题里纠结了好久,所以这里记下来,也让刚接触的小白少走些弯路. ! J/ w; F; h" Z" Z
|