Java建立WebService服務及客戶端實現
簡介
WebService是一種服務的提供方式,通過WebService,不同應用間相互間呼叫變的很方便,網路上有很多常用的WebService服務,如:http://developer.51cto.com/art/200908/147125.htm,不同的語言平臺對WebService都有實現,Java的WebService實現,比較流行的有Axis2、Jaxws,本文介紹的是Axis2。
Axis2下載和部署
Axis2是Apache開發的一個開源專案,再次感嘆Apache的偉大!
下載地址:
http://mirror.bit.edu.cn/apache/axis/axis2/java/core/1.6.2/axis2-1.6.2-war.zip
將其內axis2.war解壓到<Tomcat安裝目錄>/webapps下,啟動Tomcat,war包會自動解壓,
訪問http://localhost:8080/axis2/,如果看到歡迎主頁,則說明部署成功。
配置Axis2
<Tomcat安裝目錄>/webapps/axis2/WEB-INF/conf/axis2.xml,配置其內兩個屬性,以便除錯。
<parameter name="hotdeployment">true</parameter><!-- 開啟熱部署,不需要重啟即可部署服務 -->
<parameter name="hotupdate">true</parameter><!-- 開啟熱更新,不需要重啟即可更新服務 -->
編寫服務
所謂服務就是編寫一個類,寫一些方法,方法返回資料,WebService客戶端獲取資料。
public class HelloService {
public String sayHello() {
return "hello";
}
}
零配置釋出服務
服務類建立好後,我們需要釋出到伺服器上,將HelloService.class放到<Tomcat安裝目錄>/webapps/axis2/WEB-INF/pojo下,pojo沒有需要建立。
至此,我們已經成功的建立了一個WebService服務了,so easy!
再次訪問http://localhost:8080/axis2/,點選Services,可以發現可用services中多了一個HelloService,其內有一個可用操作sayHello,說明發布成功。
HelloService
Service Description : No description available for this service
Service EPR : http://localhost:8080/axis2/services/HelloService
Service Status : Active
Available Operations
sayHello
訪問http://localhost:8080/axis2/services/HelloService,頁面輸出正是我們的返回值。<ns:sayHelloResponse xmlns:ns="http://ws.apache.org/axis2">
<return>hello</return>
</ns:sayHelloResponse>
這裡有兩點需要注意:- 釋出的類不能放在包裡,既不能使用package關鍵字;
- 預設的釋出目錄是pojo,可以在<Tomcat安裝目錄>/webapps/axis2/WEB-INF/conf/axis2.xml中增加目錄,
<deployer extension=".class" directory="<要增加的目錄名稱>" class="org.apache.axis2.deployment.POJODeployer" />
要注意多個目錄間WebService要唯一,否則會重名,重名後,先部署的會成功,後部署的會報錯。services.xml配置檔案釋出服務
雖然上面的方式不需要配置檔案,但是其服務類不能放在包內,顯然是不符合我們日常開發的,Axis2也允許帶包的類釋出WebService,如果不允許,估計就沒人用了。
首先寫一個較複雜的服務類,多個方法,帶引數,有返回值的。
package webservice.test;
/**
* 計算器運算
*
* @author gaoshuang
*/
public class CalculateService {
// 加法
public float plus(float x, float y) {
return x + y;
}
// 減法
public float minus(float x, float y) {
return x - y;
}
// 乘法
public float multiply(float x, float y) {
return x * y;
}
// 除法
public float divide(float x, float y) {
if (y != 0)
return x / y;
else
return -1;
}
}
然後編寫services.xml,該檔案需要放在META-INF資料夾下。<?xml version="1.0" encoding="UTF-8"?>
<!-- 服務名稱 -->
<service name="CalculateService">
<!-- 服務描述 -->
<description>
加減乘除計算服務
</description>
<!-- 設定服務類 -->
<parameter name="ServiceClass">
com.runqianapp.webservice.test.CalculateService
</parameter>
<!-- 方法 -->
<operation name="plus">
<!-- 方法處理器,RPCMessageReceiver為帶返回值的處理器,
RPCInOnlyMessageReceiver為不帶返回值的處理器 -->
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
</operation>
<operation name="minus">
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
</operation>
<operation name="multiply">
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
</operation>
<operation name="divide">
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
</operation>
</service>
最後將這兩個檔案打成jar包,不論用工具還是手動打,打的都是最外層的資料夾。
我打的名字是server.jar,更改字尾為aar,所以最後是server.aar,Axis2建議使用aar釋出WebService,
將server.aar放到<Tomcat安裝目錄>/webapps/axis2/WEB-INF/services下,訪問http://localhost:8080/axis2/services/listServices,
多出了一個CalculateService,說明發布成功。
CalculateService
Service Description : CalculateService
Service EPR : http://localhost:8080/axis2/services/CalculateService
Service Status : Active
Available Operations
divide
plus
minus
multiply
分別訪問http://localhost:8080/axis2/services/CalculateService/plus?x=1&y=2
http://localhost:8080/axis2/services/CalculateService/divide?x=1&y=2
http://localhost:8080/axis2/services/CalculateService/minus?x=1&y=2
http://localhost:8080/axis2/services/CalculateService/multiply?x=1&y=2
也可以釋出多個WebService,可以使用serviceGroup標籤。
<serviceGroup>
<service name="myService1">
...
</service>
<service name="myService2">
...
</service>
</serviceGroup>
客戶端實現
以上介紹的都是WebService服務建立及釋出,那麼有了一個WebService服務後,我們如何呼叫呢?只在瀏覽器上訪問是沒有意義的。
下載Axis2客戶端壓縮包:http://mirror.esocc.com/apache/axis/axis2/java/core/1.6.2/axis2-1.6.2-bin.zip,並解壓。
新建工程WebServiceClientTest,將<Axis2客戶端安裝目錄>/lib下所有jar包新增到工程中;
編寫客戶端程式碼;
package webservice.client.test;
import javax.xml.namespace.QName;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;
public class Client1 {
/**
* @param args
* @throws AxisFault
*/
public static void main(String[] args) throws AxisFault {
// 使用RPC方式呼叫WebService
RPCServiceClient serviceClient = new RPCServiceClient();
Options options = serviceClient.getOptions();
// 指定呼叫WebService的URL
EndpointReference targetEPR = new EndpointReference(
"http://localhost:8080/axis2/services/CalculateService");
options.setTo(targetEPR);
// 呼叫方法的引數值
Object[] entryArgs = new Object[] {1, 2};
// 呼叫方法返回值的資料型別的Class物件
Class[] classes = new Class[] { float.class };
// 呼叫方法名及WSDL檔案的名稱空間
// 名稱空間是http://localhost:8080/axis2/services/CalculateService?wsdl中wsdl:definitions標籤targetNamespace屬性
QName opName = new QName("http://test.webservice", "plus");
// 執行方法獲取返回值
// 沒有返回值的方法使用serviceClient.invokeRobust(opName, entryArgs)
Object result = serviceClient.invokeBlocking(opName, entryArgs, classes)[0];
System.out.println(result);
// out: 3.0
}
}
以上是實現了一個簡單的WebSerivce客戶端,呼叫CalculateService中的plus方法,由程式碼可見,這種呼叫方式比較雜亂,程式碼不太友好。wsdl2java簡化客戶端
<Axis2客戶端安裝目錄>/bin目錄,其內有兩個bat,wsdl2java.bat和java2wsdl.bat,可以實現WSDL檔案和Java之間的互相轉換。
考慮到我們以後可能經常使用這些命令,設定環境變數,方便以後呼叫。在系統變數中加入AXIS2_HOME=<Axis2客戶端安裝目錄>,path中追加;%AXIS2_HOME%\bin。
啟動命令提示符,進入WebServiceTestClient所在目錄,執行
wsdl2java -uri http://localhost:8080/axis2/services/CalculateService?wsdl -p webservice.client.test -s
引數說明:uri - wsdl檔案路徑,網路路徑或本地路徑,p - 打包,這裡和上一個客戶端實現類打在了一個包裡,wsdl2java有很多引數,詳細可以執行該命令去檢視。執行後,如果沒有報錯,說明執行成功,重新整理專案,該包下多出了一個CalculateServiceStub類,裡面的程式碼極其複雜,還亂呼呼的,這我們不用管,呼叫該類。
package webservice.client.test;
import java.rmi.RemoteException;
import webservice.client.test.CalculateServiceStub.Plus;
public class Client2 {
/**
* @param args
* @throws RemoteException
*/
public static void main(String[] args) throws RemoteException {
CalculateServiceStub stub = new CalculateServiceStub();
Plus plus = new Plus();
plus.setX(1);
plus.setY(2);
float result = stub.plus(plus).get_return();// 返回值自動轉型,這也是強大之處
System.out.println(result);
}
}
如此做的好處就是呼叫時不需要在去檢視WSDL,和正常使用一個類一樣,對WebService的封裝都由wsdl2java自動生成,程式碼更優雅、簡潔。
利用wsdl2java輕鬆使用第三方WebService服務
有了wsdl2java,已知一個WSDL檔案我們就可以輕鬆的生成WebService客戶端供我們呼叫,給我們服務。文章開頭給出的連結包含了一些第三方服務,有一個服務是生成隨機個數中文,WSDL:http://www.webxml.com.cn/WebServices/RandomFontsWebService.asmx?wsdl,同樣,啟動命令提示符,進入專案路徑,執行
wsdl2java -uri http://www.webxml.com.cn/WebServices/RandomFontsWebService.asmx?wsdl -p webservice.client.test -s
呼叫該類package webservice.client.test;
import java.rmi.RemoteException;
import webservice.client.test.RandomFontsWebServiceStub.ArrayOfString;
import webservice.client.test.RandomFontsWebServiceStub.GetChineseFonts;
public class ThirdClient {
/**
* @param args
* @throws RemoteException
*/
public static void main(String[] args) throws RemoteException {
RandomFontsWebServiceStub stub = new RandomFontsWebServiceStub();
GetChineseFonts getChineseFonts = new GetChineseFonts();
getChineseFonts.setByFontsLength(10);// 免費使用有限制,最多8個
ArrayOfString result = stub.getChineseFonts(getChineseFonts).getGetChineseFontsResult();
for(String str : result.getString()) {
System.out.println(str);
}
}
}
原始碼下載
http://download.csdn.net/download/ghsau/6400843
(完)
本文來自:高爽|Coder,原文地址:http://blog.csdn.net/ghsau/article/details/12714965
相關文章
- python建立tcp服務端和客戶端PythonTCP服務端客戶端
- golang實現tcp客戶端服務端程式GolangTCP客戶端服務端
- Java的oauth2.0 服務端與客戶端的實現JavaOAuth服務端客戶端
- 服務端,客戶端服務端客戶端
- 客戶端,服務端客戶端服務端
- 實現客戶端與服務端的HTTP通訊客戶端服務端HTTP
- Go基於gRPC實現客戶端連入服務端GoRPC客戶端服務端
- Qt實現網路聊天室(客戶端,服務端)QT客戶端服務端
- Spring Boot 整合 WebSocket 實現服務端推送訊息到客戶端Spring BootWeb服務端客戶端
- HTML轉PDF的純客戶端和純服務端實現方案HTML客戶端服務端
- php原生socket實現客戶端與服務端資料傳輸PHP客戶端服務端
- python 搭建 webservice 服務端PythonWeb服務端
- 使用WebService釋出soap介面,並實現客戶端的https驗證Web客戶端HTTP
- 服務端渲染和客戶端渲染服務端客戶端
- Java服務端和客戶端開發輔助工具UtilsJava服務端客戶端
- springboot2整合websocket,實現服務端推送訊息到客戶端Spring BootWeb服務端客戶端
- socket實現服務端多執行緒,客戶端重複輸入服務端執行緒客戶端
- Java Spring Cloud 與響應式微服務(三)客戶服務建立JavaSpringCloud微服務
- java netty 實現 websocket 服務端和客戶端雙向通訊 實現心跳和斷線重連 完整示例JavaNettyWeb服務端客戶端
- 001 Rust 網路程式設計,實現 TCP 服務端和客戶端程式Rust程式設計TCP服務端客戶端
- Socket最簡單的客戶端與服務端通訊-Java客戶端服務端Java
- Java與WCF互動(一):Java客戶端呼叫WCF服務 (轉)Java客戶端
- 求一段python3服務端及客戶端的例子Python服務端客戶端
- 如何建立一個Java遊戲客戶端Java遊戲客戶端
- 檔案下載之斷點續傳(客戶端與服務端的實現)斷點客戶端服務端
- OSSEC服務端配置客戶端批次部署方案服務端客戶端
- 基於CFSSL工具建立CA證書,服務端證書,客戶端證書服務端客戶端
- 客戶現場服務規範
- 客戶端骨架屏實現客戶端
- Dubbo原始碼解析之客戶端初始化及服務呼叫原始碼客戶端
- Qt實現基於多執行緒的檔案傳輸(服務端,客戶端)QT執行緒服務端客戶端
- 利用tirpc庫實現簡單的客戶端和服務端RPC客戶端服務端
- 客戶服務管理:CRM實現緊急應對客戶常見問題
- macOS 自帶的ftp服務端&vnc客戶端MacFTP服務端VNC客戶端
- rsync備份【基於客戶端與服務端】客戶端服務端
- 埃森哲:端到端客戶服務報告
- MQTT伺服器搭建服務端和客戶端MQQT伺服器服務端客戶端
- 在容器服務中獲取客戶端真實源 IP客戶端
- 客戶服務CRM系統,提供優質客戶服務