JAVA 调用Web Service
JAVA 調用Web Service的方法
1.使用HttpClient
?用到的jar文件:commons-httpclient-3.1.jar
?方法:
?預先定義好Soap請求數據,可以借助于XMLSpy Professional軟件來做這一步生成。
?
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>";
?
然后定義一個PostMethod,這時需要指定web服務的Url;
?
PostMethod postMethod = new PostMethod(“http://www.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx”);
?
然后把Soap請求數據添加到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);
?
?
最后生成一個HttpClient對象,并發出postMethod請求
?
HttpClient httpClient = new HttpClient();
?statusCode = httpClient.executeMethod(postMethod);
?String soapRequestData =? postMethod.getResponseBodyAsString();
?
?
soapRequestData就是調用web服務的Soap響應數據,是xml格式的,可以通過解析soapRequestData來獲得調用web服務的返回值。
?
2.使用Xfire
?用到的jar文件xfire-all-1.2.4.jar, jdom-1.0.jar
?方法:
?定義一個Client對象,指定web服務的wsdl的地址
?
Client c = new Client(new URL(“http://www.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx?wsdl”));
?
?
調用Client對象的invoke方法,指定web服務的方法名,和參數,返回值是一個Object型的數組。
?下面代碼調用getVersionTime方法,這個方法沒有參數用所以后一個參數使用new Object[0]。
?
Object[] results = c.invoke(“getVersionTime”, new Object[0]);
?
?
3.使用axis2
?下載axis2-1.4
?方法:
?打開控制臺,進入axis2-1.4/bin目錄
?
wsdl2java.bat -uri http://www.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx?wsdl -p ws.clinet.axis2
?
上述命令執行完后,會在當前目錄下生成一個src目錄,在src\ ws\ clinet\ axis2目錄里生成XXXXCallbackHandler.java和XXXXStub.java兩個文件。
?wsdl2java 會根據wsdl文件生成web服務的調用接口,參數類,返回值的類。
?在調用webservice的時候直接實例化一個XXXXStub的對象,然后調用web服務的方法就可以了。
?
4. 總結
?針對某種工具搭建的Web Service服務可能有與其對應的更簡單的調用方法,在這里沒有做描述,上述的調用web服務的方法是通用的。
?上述三種方法中使用httpclient應該是比較靈活,但是開發效率低,難度大,使用Xfire和axis2比較容易,開發速度快,但是axis2通用性不好,有的web服務用axis2不好用。httpclient和Xfire通用性比較好,鑒于以上特點推薦使用Xfire。
?
================
java 調用webservice的各種方法總結
???
一、利用jdk web服務api實現,這里使用基于 SOAP message 的 Web 服務
???? 1.首先建立一個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 [存放編譯后的文件目錄] Hello.java ) ,會生成 jaws目錄
??? 3.使用java Hello.Hello運行,然后將瀏覽器指向http://localhost:8080/hello?wsdl就會出現下列顯示
?
?? 4.使用wsimport 生成客戶端?
???
???? 使用如下:wsimport -p . -keep http://localhost:8080/hello?wsdl
??? 這時,會在當前目錄中生成如下文件:
?????????
?????? 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?
???? 以上方法還稍顯繁瑣,還有更加簡單的方法
?
二、使用xfire,我這里使用的是myeclipse集成的xfire進行測試的
??? 利用xfire開發WebService,可以有三種方法:
????? 1一種是從javabean 中生成;
????? 2 一種是從wsdl文件中生成;
????? 3 還有一種是自己建立webservice
??? 步驟如下:
??? 用myeclipse建立webservice工程,目錄結構如下:
?
??? 首先建立webservice接口,
???? 代碼如下:
?????
1package com.myeclipse.wsExample;
2//Generated by MyEclipse
3
4public interface IHelloWorldService {
5???
6??? public String example(String message);
7???
8}????? 接著實現這個借口:? 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> 把整個項目部署到tomcat服務器中 ,打開瀏覽器,輸入http://localhost:8989/HelloWorld/services/HelloWorldService?wsdl,可以看到如下:
????
?然后再展開HelloWorldService后面的wsdl可以看到:
?
客戶端實現如下:? 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?????? 這里再說點題外話,有時候我們知道一個wsdl地址,比如想用java客戶端引用.net 做得webservice,使用myeclipse引用,但是卻出現無法通過驗證的錯誤,這時我們可以直接在類中引用,步驟如下:
????????? 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//遠程調用.net開發的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//調用.net本機開發的webservice
12Client c1=new Client(new URL("http://localhost/zj/Service.asmx?wsdl"));
13Object[] o1=c1.invoke("HelloWorld",new String[]{});
14???????
15}?
三、使用axis1.4調用webservice方法
?? 前提條件:下載axis1.4包和tomcat服務器?? ,并將axis文件夾復制到tomcat服務器的webapp文件夾中
?? 這里我就說一下最簡單的方法:
???????? 首先建立一個任意的java類(例如:HelloWorld.java),復制到axis文件夾下,將其擴展名改為jws,然后重新啟動tomcat,在瀏覽器中輸入http://localhost:8989/axis/HelloWorld.jws?wsdl,就會得到一個wsdl文件,其客戶端調用方法如下:
??? 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開發webservice()???
? 使用axis2 需要先下載?
?? axis2-1.4.1-bin.zip
?? axis2-1.4.1-war.zip
? http://ws.apache.org/axis2/??
? 同理,也需要將axis2復制到webapp目錄中
在axis2中部署webservice有兩種方法,
??? 第一種是pojo方式,這種方式比較簡單,但是有一些限制,例如部署的類不能加上包名
??? 第二種方式是利用xml發布webservice,這種方法比較靈活,不需要限制類的聲明
??? 下面分別說明使用方法:
??? 1.pojo方式:在Axis2中不需要進行任何的配置,就可以直接將一個簡單的POJO發布成WebService。其中POJO中所有的public方法將被發布成WebService方法。先實現一個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?? 由于這兩個方法都是public類型,所以都會發布成webservice。編譯HelloWorld類后,將HelloWorld.class文件放到%tomcat%\webapps\axis2\WEB-INF\pojo目錄中(如果沒有pojo目錄,則建立該目錄),然后打開瀏覽器進行測試:
輸入一下url:?
http://localhost:8080/axis2/services/listServices
會列出所有webservice
?
這是其中的兩個webservice列表,接著,在客戶端進行測試:
首先可以寫一個封裝類,減少編碼,代碼如下:
?
??? 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數組
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中返回一個對象的實例
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/?????? 讀者可以自己封裝數據類型,如int,byte,float等數據類型
60}
61
客戶端調用方法:
? 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發布webservice,這種方式和直接放在pojo目錄中的POJO類不同。要想將MyService類發布成Web Service,需要一個services.xml文件,這個文件需要放在META-INF目錄中,該文件的內容如下: <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>元素用于發布Web Service,一個<service>元素只能發布一個WebService類,name屬性表示WebService名,如下面的URL可以獲得這個WebService的WSDL內容:
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如果要發布多個webservice,可以在文件兩段加上<serviceGroup><service></service>...<service></service></serviceGroup>發布
總結
以上是生活随笔為你收集整理的JAVA 调用Web Service的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在网页中插入百度地图
- 下一篇: 网页图片轮播