因工作需要,最近需要通过java调用webservice的方法拿数据. 我是第一次接触,然后大概看了下webservice说明,以为就是个别的网站提供的接口,我只要访问那个连接将参数传递过去就可以了,于是我用手敲了下试试(就是地址栏以get形式提交参数),然后发现不是这样用的...然后又仔细看了些说明,才知道是怎么使用的,看网上有资料说有很多方法可以实现,我这里介绍一下我实现所使用的方法. 首先需要导入四个jar包,下载地址是 http://download.csdn.net/detail/c5906343/7592183 4 }; D }" @: w& M. ^7 j5 B! n) c x6 P
然后就是代码实现 webservice方法的样子如下 ) D8 b1 g0 v# n ]
[html] view plaincopy
0 |! O }# w( O' Z* q8 _# M' y1 x& r, H' d5 j" @4 A0 e
9 ]2 \( e) ~/ [$ ~
- <soap:Body>
- <validate xmlns="http://abc.org/">
- <a>string</ssoTokenId>
- <b>string</appId>
- <c>int</detail>
- </validate>
- </soap:Body> 8 m/ i! [. [1 n% o
9 U# O. N# Y- v! Z+ I, V
/ H* X$ g8 w1 ?/ `
对应的Java实现方式如下
Y4 g4 F. S# E2 n
: n' z! E) h- w3 k5 F3 B; {& A' T[java] view plaincopy
Y# i, V7 o1 P3 j1 y9 [
( V% N8 Q' M4 B( r1 ^# L, H4 x, @; k& r8 j. O( a
- 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类型,传参时也应为字符串
2 D) E' k+ Y. Y' D# H0 z
/ w2 f+ l! o) d* m7 M+ _. l! d/ N9 S+ A
* ~8 ~1 @3 w6 q' g& I# \& K* |" m8 n7 Y说一下我遇到的问题 我是通过Java访问的.net的webservice,刚开始会有一个异常,是因为.net中少了一句声明,加上就没问题了 然后就是刚开始添加参数的时候是这么用的
2 p; |: F2 w" P9 H8 }+ i[java] view plaincopy' N1 ?) x C, K. ^
5 X& _( Q1 p) C3 d! J
5 k& m( m$ w. W6 J0 ]) N- call.addParameter("a", javax.xml.rpc.encoding.XMLType.XSD_STRING,javax.xml.rpc.ParameterMode.IN);
" G% ]7 m! C7 G) G : x' D: i; p; m, J( I+ Q. J) D) y
这样使用的话是不行的,参数会传递不到webservice,导致webservice接收不到参数, b9 }! w, J; ` l7 I
还有我刚开始传递int类型的值时是 [java] view plaincopy
( h" q h3 o! A3 W5 Q8 a
7 o7 c' I6 l8 Y) \
& N* n4 E4 j3 G: z5 h2 g0 K; ?, t& I6 _- new Object[]{"val1","val2",2014} 8 J( E: |, A/ z7 {$ {! R. b5 W+ ?1 a
+ v- a% L- n, v# I
8 j8 Y. U" W% Z: o/ I0 D/ X" h
赋值的int类型的数据,这样也是不行的,需要把int转换为字符串传递才可以 . p3 l# V# K! p6 `9 Y6 c. F; M3 X0 z( c
就这么短短的几句话就可以实现调用webservice的方法了,其实挺简单的,就是第一次接触,在我遇到的问题里纠结了好久,所以这里记下来,也让刚接触的小白少走些弯路.
8 j7 C, `8 S- a" v |