因工作需要,最近需要通过java调用webservice的方法拿数据. 我是第一次接触,然后大概看了下webservice说明,以为就是个别的网站提供的接口,我只要访问那个连接将参数传递过去就可以了,于是我用手敲了下试试(就是地址栏以get形式提交参数),然后发现不是这样用的...然后又仔细看了些说明,才知道是怎么使用的,看网上有资料说有很多方法可以实现,我这里介绍一下我实现所使用的方法. 首先需要导入四个jar包,下载地址是 http://download.csdn.net/detail/c5906343/7592183 0 i$ z! ~+ v( W' i/ \" J& ~
然后就是代码实现 webservice方法的样子如下
, m7 _" ?2 a( m9 t$ E[html] view plaincopy
0 @7 R) d5 r& a8 D2 X' M+ S
2 M* c! e! S' Z* Y: a: f' p: y
; f8 g1 q' ^ g5 J- d8 d- <soap:Body>
- <validate xmlns="http://abc.org/">
- <a>string</ssoTokenId>
- <b>string</appId>
- <c>int</detail>
- </validate>
- </soap:Body> ) Z* `. r) Y; s& f$ V
: v+ |+ K$ Y) a z$ h# j+ y- o+ g* d; j
对应的Java实现方式如下9 |3 \" [1 e3 N# T5 k; i% W0 C
* ~. X0 W" y* Q7 N, s+ u- [, p" a[java] view plaincopy
/ z9 o! l8 S- |
" n5 T1 j3 e" L4 O- p9 Q
6 s4 h& P; S( ^/ R" u! }- 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类型,传参时也应为字符串 & {+ v2 r; |: z/ P/ a
7 K/ W8 m8 K0 K7 P1 t+ m* ?9 |8 g( d- e5 Z8 Z6 Y# r
& m' {0 P4 Q. m. O; n* i
说一下我遇到的问题 我是通过Java访问的.net的webservice,刚开始会有一个异常,是因为.net中少了一句声明,加上就没问题了 然后就是刚开始添加参数的时候是这么用的 1 _- y) a7 Z* F( i; S' v* ~
[java] view plaincopy! G0 I; U1 d# J; J8 P
) \+ Y/ A: N: J7 Z' R# j+ A. u
8 z" ^' @6 z, a# `9 x" Z- call.addParameter("a", javax.xml.rpc.encoding.XMLType.XSD_STRING,javax.xml.rpc.ParameterMode.IN);
T& d/ Y9 T6 m) g
6 k) d! G/ G, a; C V; z" ]8 Y& f& q, x这样使用的话是不行的,参数会传递不到webservice,导致webservice接收不到参数$ O5 Z$ Y# \/ Q+ }. h. o$ v; j2 f
还有我刚开始传递int类型的值时是 [java] view plaincopy6 I1 y) P7 e, h% r1 _% ?1 i1 E
- R, r, m, m; x" S9 H6 T9 b7 w
/ G0 s; y/ D4 i/ [/ l. J( B% m
- new Object[]{"val1","val2",2014} " P, f* e8 B& Z5 Q f9 V
0 ?5 i5 b U7 z# u' G0 B2 L" _. y, o% o- h K
赋值的int类型的数据,这样也是不行的,需要把int转换为字符串传递才可以 & E0 A- _1 [5 r/ r
就这么短短的几句话就可以实现调用webservice的方法了,其实挺简单的,就是第一次接触,在我遇到的问题里纠结了好久,所以这里记下来,也让刚接触的小白少走些弯路. 5 Q2 O9 |0 k/ B4 h
|