JAVA 调用Web Service
JAVA 調(diào)用Web Service的方法
1.使用HttpClient
?用到的jar文件:commons-httpclient-3.1.jar
?方法:
?預(yù)先定義好Soap請(qǐng)求數(shù)據(jù),可以借助于XMLSpy Professional軟件來(lái)做這一步生成。
?
String soapRequestData = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
???? "<soap12:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap12=\"http://www.w3.org/2003/05/soap-envelope\">" +
?????? "<soap12:Body>" +
??????? " <getCountryCityByIp xmlns=\"http://WebXml.com.cn/\">" +
?????? "??? <theIpAddress>219.137.167.157</theIpAddress>" +
????? "?? </getCountryCityByIp>" +
???? "? </soap12:Body>" +
???? "</soap12:Envelope>";
?
然后定義一個(gè)PostMethod,這時(shí)需要指定web服務(wù)的Url;
?
PostMethod postMethod = new PostMethod(“http://www.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx”);
?
然后把Soap請(qǐng)求數(shù)據(jù)添加到PostMethod中
?
byte[] b = soapRequestData.getBytes("utf-8");
?InputStream is = new ByteArrayInputStream(b,0,b.length);
?RequestEntity re = new InputStreamRequestEntity(is,b.length,"application/soap+xml; charset=utf-8");
?postMethod.setRequestEntity(re);
?
?
最后生成一個(gè)HttpClient對(duì)象,并發(fā)出postMethod請(qǐng)求
?
HttpClient httpClient = new HttpClient();
?statusCode = httpClient.executeMethod(postMethod);
?String soapRequestData =? postMethod.getResponseBodyAsString();
?
?
soapRequestData就是調(diào)用web服務(wù)的Soap響應(yīng)數(shù)據(jù),是xml格式的,可以通過(guò)解析soapRequestData來(lái)獲得調(diào)用web服務(wù)的返回值。
?
2.使用Xfire
?用到的jar文件xfire-all-1.2.4.jar, jdom-1.0.jar
?方法:
?定義一個(gè)Client對(duì)象,指定web服務(wù)的wsdl的地址
?
Client c = new Client(new URL(“http://www.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx?wsdl”));
?
?
調(diào)用Client對(duì)象的invoke方法,指定web服務(wù)的方法名,和參數(shù),返回值是一個(gè)Object型的數(shù)組。
?下面代碼調(diào)用getVersionTime方法,這個(gè)方法沒(méi)有參數(shù)用所以后一個(gè)參數(shù)使用new Object[0]。
?
Object[] results = c.invoke(“getVersionTime”, new Object[0]);
?
?
3.使用axis2
?下載axis2-1.4
?方法:
?打開(kāi)控制臺(tái),進(jìn)入axis2-1.4/bin目錄
?
wsdl2java.bat -uri http://www.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx?wsdl -p ws.clinet.axis2
?
上述命令執(zhí)行完后,會(huì)在當(dāng)前目錄下生成一個(gè)src目錄,在src\ ws\ clinet\ axis2目錄里生成XXXXCallbackHandler.java和XXXXStub.java兩個(gè)文件。
?wsdl2java 會(huì)根據(jù)wsdl文件生成web服務(wù)的調(diào)用接口,參數(shù)類,返回值的類。
?在調(diào)用webservice的時(shí)候直接實(shí)例化一個(gè)XXXXStub的對(duì)象,然后調(diào)用web服務(wù)的方法就可以了。
?
4. 總結(jié)
?針對(duì)某種工具搭建的Web Service服務(wù)可能有與其對(duì)應(yīng)的更簡(jiǎn)單的調(diào)用方法,在這里沒(méi)有做描述,上述的調(diào)用web服務(wù)的方法是通用的。
?上述三種方法中使用httpclient應(yīng)該是比較靈活,但是開(kāi)發(fā)效率低,難度大,使用Xfire和axis2比較容易,開(kāi)發(fā)速度快,但是axis2通用性不好,有的web服務(wù)用axis2不好用。httpclient和Xfire通用性比較好,鑒于以上特點(diǎn)推薦使用Xfire。
?
================
java 調(diào)用webservice的各種方法總結(jié)
???
一、利用jdk web服務(wù)api實(shí)現(xiàn),這里使用基于 SOAP message 的 Web 服務(wù)
???? 1.首先建立一個(gè)Web services EndPoint: package Hello;??
import javax.jws.WebService;??
import javax.jws.WebMethod;??
import javax.xml.ws.Endpoint;??
?
@WebService?
public class Hello {?
?
@WebMethod?
public String hello(String name) {??
return "Hello, " + name + "\n";??
}??
???
?public static void main(String[] args) {??
?? // create and publish an endpoint??
?????? Hello hello = new Hello();??
?????? Endpoint endpoint = Endpoint.publish("http://localhost:8080/hello", hello);???
??????? }??
}
???????? 2.使用 apt 編譯 Hello.java(例:apt -d [存放編譯后的文件目錄](méi) Hello.java ) ,會(huì)生成 jaws目錄
??? 3.使用java Hello.Hello運(yùn)行,然后將瀏覽器指向http://localhost:8080/hello?wsdl就會(huì)出現(xiàn)下列顯示
?
?? 4.使用wsimport 生成客戶端?
???
???? 使用如下:wsimport -p . -keep http://localhost:8080/hello?wsdl
??? 這時(shí),會(huì)在當(dāng)前目錄中生成如下文件:
?????????
?????? 5.客戶端程序:
?????? 1class HelloClient{??
2public static void main(String args[]) {??
3? HelloService service = new HelloService();??
4? Hello helloProxy = service.getHelloPort();??
5? String hello = helloProxy.hello("你好");?????????
6? System.out.println(hello);??
7? }??
8}
9?
???? 以上方法還稍顯繁瑣,還有更加簡(jiǎn)單的方法
?
二、使用xfire,我這里使用的是myeclipse集成的xfire進(jìn)行測(cè)試的
??? 利用xfire開(kāi)發(fā)WebService,可以有三種方法:
????? 1一種是從javabean 中生成;
????? 2 一種是從wsdl文件中生成;
????? 3 還有一種是自己建立webservice
??? 步驟如下:
??? 用myeclipse建立webservice工程,目錄結(jié)構(gòu)如下:
?
??? 首先建立webservice接口,
???? 代碼如下:
?????
1package com.myeclipse.wsExample;
2//Generated by MyEclipse
3
4public interface IHelloWorldService {
5???
6??? public String example(String message);
7???
8}????? 接著實(shí)現(xiàn)這個(gè)借口:? 1package com.myeclipse.wsExample;
?2//Generated by MyEclipse
?3
?4public class HelloWorldServiceImpl implements IHelloWorldService {
?5???
?6??? public String example(String message) {
?7??????? return message;
?8??? }
?9???
10}?? 修改service.xml 文件,加入以下代碼:
?? 1<service>
?2??????? <name>HelloWorldService</name>
?3??????? <serviceClass>
?4??????????? com.myeclipse.wsExample.IHelloWorldService
?5??????? </serviceClass>
?6??????? <implementationClass>
?7??????????? com.myeclipse.wsExample.HelloWorldServiceImpl
?8??????? </implementationClass>
?9??????? <style>wrapped</style>
10??????? <use>literal</use>
11??????? <scope>application</scope>
12??? </service> 把整個(gè)項(xiàng)目部署到tomcat服務(wù)器中 ,打開(kāi)瀏覽器,輸入http://localhost:8989/HelloWorld/services/HelloWorldService?wsdl,可以看到如下:
????
?然后再展開(kāi)HelloWorldService后面的wsdl可以看到:
?
客戶端實(shí)現(xiàn)如下:? 1package com.myeclipse.wsExample.client;
?2
?3import java.net.MalformedURLException;
?4import java.net.URL;
?5
?6import org.codehaus.xfire.XFireFactory;
?7import org.codehaus.xfire.client.Client;
?8import org.codehaus.xfire.client.XFireProxyFactory;
?9import org.codehaus.xfire.service.Service;
10import org.codehaus.xfire.service.binding.ObjectServiceFactory;
11
12import com.myeclipse.wsExample.IHelloWorldService;
13
14public class HelloWorldClient {
15public static void main(String[] args) throws MalformedURLException, Exception {
16// TODO Auto-generated method stub
17Service s=new ObjectServiceFactory().create(IHelloWorldService.class);
18XFireProxyFactory xf=new XFireProxyFactory(XFireFactory.newInstance().getXFire());
19String url="http://localhost:8989/HelloWorld/services/HelloWorldService";
20
21??????? try
22??????? {???????????
23???????????
24??????????? IHelloWorldService hs=(IHelloWorldService) xf.create(s,url);
25??????????? String st=hs.example("zhangjin");
26??????????? System.out.print(st);
27??????? }
28??????? catch(Exception e)
29??????? {
30??????????? e.printStackTrace();
31??????? }
32??? }
33
34}
35?????? 這里再說(shuō)點(diǎn)題外話,有時(shí)候我們知道一個(gè)wsdl地址,比如想用java客戶端引用.net 做得webservice,使用myeclipse引用,但是卻出現(xiàn)無(wú)法通過(guò)驗(yàn)證的錯(cuò)誤,這時(shí)我們可以直接在類中引用,步驟如下:
????????? 1public static void main(String[] args) throws MalformedURLException, Exception {
?2??????? // TODO Auto-generated method stub
?3??????? Service s=new ObjectServiceFactory().create(IHelloWorldService.class);
?4??????? XFireProxyFactory xf=new XFireProxyFactory(XFireFactory.newInstance().getXFire());
?5???????
?6???????
?7//遠(yuǎn)程調(diào)用.net開(kāi)發(fā)的webservice
?8Client c=new Client(new URL("http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx?wsdl"));
?9??????? Object[] o=c.invoke("qqCheckOnline", new String[]{"531086641","591284436"});
10???????
11//調(diào)用.net本機(jī)開(kāi)發(fā)的webservice
12Client c1=new Client(new URL("http://localhost/zj/Service.asmx?wsdl"));
13Object[] o1=c1.invoke("HelloWorld",new String[]{});
14???????
15}?
三、使用axis1.4調(diào)用webservice方法
?? 前提條件:下載axis1.4包和tomcat服務(wù)器?? ,并將axis文件夾復(fù)制到tomcat服務(wù)器的webapp文件夾中
?? 這里我就說(shuō)一下最簡(jiǎn)單的方法:
???????? 首先建立一個(gè)任意的java類(例如:HelloWorld.java),復(fù)制到axis文件夾下,將其擴(kuò)展名改為jws,然后重新啟動(dòng)tomcat,在瀏覽器中輸入http://localhost:8989/axis/HelloWorld.jws?wsdl,就會(huì)得到一個(gè)wsdl文件,其客戶端調(diào)用方法如下:
??? 1import javax.xml.rpc.Service;
?2import javax.xml.rpc.ServiceException;
?3import javax.xml.rpc.ServiceFactory;
?4
?5import java.net.MalformedURLException;
?6import java.net.URL;
?7import java.rmi.RemoteException;
?8
?9import javax.xml.namespace.QName;
10
11public class TestHelloWorld {
12
13
14??? public static void main(String[] args) throws MalformedURLException, ServiceException, RemoteException {
15??????? // TODO Auto-generated method stub
16???????
17??????? String wsdlUrl ="http://localhost:8989/axis/HelloWorld.jws?wsdl";
18??????? String nameSpaceUri ="http://localhost:8989/axis/HelloWorld.jws";
19??????? String serviceName = "HelloWorldService";
20??????? String portName = "HelloWorld";
21???????
22??????? ServiceFactory serviceFactory = ServiceFactory.newInstance();
23??????? Service afService =serviceFactory.createService(new URL(wsdlUrl),new QName(nameSpaceUri, serviceName));
24??????? HelloWorldInterface proxy = (HelloWorldInterface)afService.getPort(new QName(nameSpaceUri, portName),HelloWorldInterface.class);
25??????? System.out.println("return value is "+proxy.getName("john") ) ;
26???????
27??? }
28
29}
30
四、使用axis2開(kāi)發(fā)webservice()???
? 使用axis2 需要先下載?
?? axis2-1.4.1-bin.zip
?? axis2-1.4.1-war.zip
? http://ws.apache.org/axis2/??
? 同理,也需要將axis2復(fù)制到webapp目錄中
在axis2中部署webservice有兩種方法,
??? 第一種是pojo方式,這種方式比較簡(jiǎn)單,但是有一些限制,例如部署的類不能加上包名
??? 第二種方式是利用xml發(fā)布webservice,這種方法比較靈活,不需要限制類的聲明
??? 下面分別說(shuō)明使用方法:
??? 1.pojo方式:在Axis2中不需要進(jìn)行任何的配置,就可以直接將一個(gè)簡(jiǎn)單的POJO發(fā)布成WebService。其中POJO中所有的public方法將被發(fā)布成WebService方法。先實(shí)現(xiàn)一個(gè)pojo類:
?? 1public class HelloWorld{
?2??? public String getName(String name)
?3??? {
?4??????? return "你好 " + name;
?5??? }???
?6??? public int add(int a,int b)
?7??? {
?8??????? return a+b;
?9??? }???
10}
11?? 由于這兩個(gè)方法都是public類型,所以都會(huì)發(fā)布成webservice。編譯HelloWorld類后,將HelloWorld.class文件放到%tomcat%\webapps\axis2\WEB-INF\pojo目錄中(如果沒(méi)有pojo目錄,則建立該目錄),然后打開(kāi)瀏覽器進(jìn)行測(cè)試:
輸入一下url:?
http://localhost:8080/axis2/services/listServices
會(huì)列出所有webservice
?
這是其中的兩個(gè)webservice列表,接著,在客戶端進(jìn)行測(cè)試:
首先可以寫(xiě)一個(gè)封裝類,減少編碼,代碼如下:
?
??? 1package MZ.GetWebService;
?2import javax.xml.namespace.QName;
?3
?4import org.apache.axis2.AxisFault;
?5import org.apache.axis2.addressing.EndpointReference;
?6import org.apache.axis2.client.Options;
?7import org.apache.axis2.rpc.client.RPCServiceClient;
?8
?9
10public class GetWSByAxis2 {
11????? private static String EndPointUrl;
12????? private static String QUrl="http://ws.apache.org/axis2";
13????? private QName opAddEntry;
14????? public String WSUrl;
15????? public RPCServiceClient setOption() throws AxisFault
16????? {
17????????? RPCServiceClient serviceClient = new RPCServiceClient();
18????????? Options options = serviceClient.getOptions();
19????????? EndpointReference targetEPR = new EndpointReference(WSUrl);
20????????? options.setTo(targetEPR);
21????????? return serviceClient;
22????? }
23?????
24????? public QName getQname(String Option){
25?????????
26????????? return new QName (QUrl,Option);
27????? }
28 //返回String
29????? public String getStr(String Option) throws AxisFault
30????? {
31????????? RPCServiceClient serviceClient =this.setOption();
32????
33????????? opAddEntry =this.getQname(Option);
34?????
35???????? String str = (String) serviceClient.invokeBlocking(opAddEntry,
36????????????????????????? new Object[]{}, new Class[]{String.class })[0];
37???????? return str;
38???? }
39// 返回一維String數(shù)組
40????? public String[] getArray(String Option) throws AxisFault
41????? {
42????????? RPCServiceClient serviceClient =this.setOption();
43????
44????????? opAddEntry =this.getQname(Option);
45?????
46???????? String[] strArray = (String[]) serviceClient.invokeBlocking(opAddEntry,
47????????????????????????? new Object[]{}, new Class[]{String[].class })[0];
48???????? return strArray;
49???? }
50????? //從WebService中返回一個(gè)對(duì)象的實(shí)例
51???? public Object getObject(String Option,Object o) throws AxisFault
52???? {
53??????? RPCServiceClient serviceClient =this.setOption();
54???????? QName qname=this.getQname(Option);
55???????? Object object = serviceClient.invokeBlocking(qname, new Object[]{},new Class[]{o.getClass()})[0];
56???????? return object;
57???? }
58????
59/?????? 讀者可以自己封裝數(shù)據(jù)類型,如int,byte,float等數(shù)據(jù)類型
60}
61
客戶端調(diào)用方法:
? MZ.GetWebService.GetWSByAxis2 ws=new MZ.GetWebService.GetWSByAxis2();
ws.WSUrl="http://localhost:8989/axis2/services/HelloWorld";
HelloWorld hello= (HelloWorld)ws.getObject("getName", HelloWorld.class);
???????????
??????????
?System.out.println(hello.getName("zhangjin"));
???? 2.使用service.xml發(fā)布webservice,這種方式和直接放在pojo目錄中的POJO類不同。要想將MyService類發(fā)布成Web Service,需要一個(gè)services.xml文件,這個(gè)文件需要放在META-INF目錄中,該文件的內(nèi)容如下: <service name="HelloWorld">
??? <description>
??????? HelloWorld webservice
??? </description>
??? <parameter name="ServiceClass">
??????? service.HelloWorld?
??? </parameter>
??? <messageReceivers>
??????? <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
??????????? class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
??????? <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"
??????????? class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />
??? </messageReceivers>
</service>
其中<service>元素用于發(fā)布Web Service,一個(gè)<service>元素只能發(fā)布一個(gè)WebService類,name屬性表示W(wǎng)ebService名,如下面的URL可以獲得這個(gè)WebService的WSDL內(nèi)容:
http://localhost:8080/axis2/services/myService?wsdl
? 除此之外,還有直接可以在其中制定webservice操作方法:可以這樣些service.xml文件
?1<service name="HelloWorld">
?2??? <description>
?3?????? HelloWorld service
?4??? </description>
?5??? <parameter name="ServiceClass">
?6??????? service.HelloWorld?
?7??? </parameter>
?8??? <operation name="getName">
?9??????? <messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
10??? </operation>
11??? <operation name="add">
12??????? <messageReceiver
13??????????? class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
14??? </operation>
15</service>
16如果要發(fā)布多個(gè)webservice,可以在文件兩段加上<serviceGroup><service></service>...<service></service></serviceGroup>發(fā)布
總結(jié)
以上是生活随笔為你收集整理的JAVA 调用Web Service的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 在网页中插入百度地图
- 下一篇: 网页图片轮播