1.什麼是Web Service
Webservice是一種遠程調用技術,也叫XML Web Service,是一種可以接收從Internet或者Intranet上的其它系統中傳遞過來的請求,較輕量級的獨立通訊技術。通過SOAP協議在Web上提供的軟件服務,使用WSDL文件進行說明,並通過UDDI進行註冊。
Web Service(WEB服務)能夠快捷和方便地綜合結合各種系統、商務和任何應用平臺。利用最新的Web Service 標準能夠使任何軟件系統和系統之間的應用互通互聯,方便,而且更加廉價。
在使用Web Service之前我們首先需要了解幾個概念
1.1 XML:(Extensible Markup Language)擴展型可標記語言
面向短期的臨時數據處理、面向萬維網絡,是Soap的基礎。
1.2 SOAP:(Simple ObjectAccess Protocol)簡單對象存取協議
是XML Web Service的通信協議。當用戶通過UDDI找到你的WSDL描述文檔後,他通過可以SOAP調用你建立的Web服務
中的一個或多個操作。SOAP是XML文檔形式的調用方法的規範,它可以支持不同的底層接口,像HTTP(S)或者SMTP。
1.3 WSDL:(Web Services Description Language) 網絡服務描述語言
是一門基於 XML 的語言,用於描述 Web Services 以及如何對它們進行訪問。WSDL 文件是一個 XML 文檔,用於
說明一組SOAP 消息以及如何交換這些消息。大多數情況下由軟件自動生成和使用。
2.Web Service基本使用
首先構建一個簡單的java項目即可,編寫服務接口類和服務接口實現類
Web Service中成爲SEI(WebService EndPoint Interface)即web service的終端接口。
WeatherService.java
package com.ithzk.service;
/**
* 天氣服務接口
* @author hzk
* @date 2018/7/18
*/
public interface WeatherService {
public String getWeather(String city);
}
WeatherServiceImple.java
package com.ithzk.service.impl;
import com.ithzk.service.WeatherService;
import javax.jws.WebService;
/**
* @author hzk
* @date 2018/7/18
*/
@WebService
public class WeatherServiceImple implements WeatherService{
@Override
public String getWeather(String city) {
System.out.println("Request City:"+city);
String response = "Weather:"+Math.random()*3;
return response;
}
}
這裏由於是WebService服務,服務提供端口上需要加上@WebService註解標明爲Web Service服務
接下來只需要一個服務發佈即可
WeatherServer.java
package com.ithzk;
import com.ithzk.service.impl.WeatherServiceImple;
import javax.xml.ws.Endpoint;
/**
* 服務發佈
* @author hzk
*/
public class WeatherServer
{
public static void main( String[] args ){
//服務發佈地址
String address = "http://127.0.0.1:12345/weather";
//服務提供實現
WeatherServiceImple weatherServiceImple = new WeatherServiceImple();
Endpoint.publish(address,weatherServiceImple);
System.out.println("Weather Service publish success!");
}
}
啓動該發佈程序即可將我們需要提供的服務以Web Service方式發佈出去
此時我們可以通過WSDL查看我們提供的服務的一些相關信息 127.0.0.1:12345/weather?wsdl
到這裏的話我們一個簡單的Web Service就發佈成功了,那麼我們如何去調用
首先我們需要利用wsimport通過Web Service生成的wsdl去生成客戶端調用的一些工具代碼
通過CMD命令行(Win+R)跳轉至項目目錄,執行wsimport -s . http://127.0.0.1:12345/weather?wsdl
或者將.改爲項目目錄是一樣的效果
當這裏執行成功之後,我們更新我們的項目目錄發現多了一些wsimport生成的代碼
我們再快速構建一個項目,用來作爲Web Service的客戶端,然後將這些生成的代碼放至其目錄下,構建一個客戶端調用類
WeatherClient.java
package com.ithzk;
import com.ithzk.service.impl.WeatherServiceImple;
import com.ithzk.service.impl.WeatherServiceImpleService;
/**
* 天氣服務客戶端
* @author hzk
*/
public class WeatherClient
{
public static void main( String[] args )
{
//構建服務視圖
WeatherServiceImpleService weatherServiceImpleService = new WeatherServiceImpleService();
//獲取portType對象
WeatherServiceImple weatherServiceImplePort = weatherServiceImpleService.getWeatherServiceImplePort();
//調用服務端
String response = weatherServiceImplePort.getWeather("BeiJing");
System.out.println("Client To Server Response:"+response);
}
}
服務端控制檯和客戶端控制檯都如期打印出了我們想要的結果,整個流程下來就完成了簡單的Web Service的發佈和調用
這裏推薦幾篇比較詳細個人覺得寫的比較好的博客分享給大家參考
WebService(2)—WebService的相關概念(WSDL、SOAP、SEI、CXF)
3.Axis部署Web Service
通過Apache下的Axis也可以實現Web Service服務發佈,這裏先介紹Axis1不是Axis2,有機會後面補充
首先我構建了一個Maven web項目,添加我們Axis所需要用到的依賴
pom.xml
<dependency>
<groupId>axis</groupId>
<artifactId>axis</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>axis</groupId>
<artifactId>axis-wsdl4j</artifactId>
<version>1.5.1</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
然後在web.xml中配置Axis發佈Web Service的配置
web.xml
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>AdminServlet</servlet-name>
<display-name>Axis Admin Servlet</display-name>
<servlet-class>org.apache.axis.transport.http.AdminServlet</servlet-class>
<load-on-startup>100</load-on-startup>
</servlet>
<servlet>
<servlet-name>AxisServlet</servlet-name>
<display-name>Apache-Axis Servlet</display-name>
<servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/servlet/AxisServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>*.jws</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AdminServlet</servlet-name>
<url-pattern>/servlet/AdminServlet</url-pattern>
</servlet-mapping>
</web-app>
然後我們去編寫一個服務類
CityService.java
package com.ithzk;
/**
* @author hzk
* @date 2018/7/18
*/
public class CityService {
public String getCity(String msg){
System.out.println("Request :" + msg);
return msg+Math.random()*3;
}
}
接下來是關鍵一步,我們需要建一個server-config.wsdd文件,這個文件可以通過某些方式自動生成,後面介紹,
這裏我們先簡單配置一下,大家也可以去了解一下屬性含義和文件結構自己配置,待會貼兩篇博友的文章
server-config.wsdd
<deployment name="defaultClientConfig"
xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"
>
<globalConfiguration>
<parameter name="disablePrettyXML" value="true"/>
<parameter name="dotNetSoapEncFix" value="true"/>
<parameter name="enableNamespacePrefixOptimization" value="false"/>
<requestFlow>
<handler type="java:org.apache.axis.handlers.JWSHandler">
<parameter name="scope" value="session"/>
</handler>
<handler type="java:org.apache.axis.handlers.JWSHandler">
<parameter name="scope" value="request"/>
<parameter name="extension" value=".jwr"/>
</handler>
<!-- uncomment this if you want the SOAP monitor -->
<!--
<handler type="java:org.apache.axis.handlers.SOAPMonitorHandler"/>
-->
</requestFlow>
<!-- uncomment this if you want the SOAP monitor -->
<!--
<responseFlow>
<handler type="java:org.apache.axis.handlers.SOAPMonitorHandler"/>
</responseFlow>
-->
</globalConfiguration>
<handler type="java:org.apache.axis.handlers.http.URLMapper" name="URLMapper"/>
<handler type="java:org.apache.axis.transport.local.LocalResponder" name="LocalResponder"/>
<handler type="java:org.apache.axis.handlers.SimpleAuthenticationHandler" name="Authenticate"/>
<service name="AdminService" provider="java:MSG">
<namespace>http://xml.apache.org/axis/wsdd/</namespace>
<parameter name="allowedMethods" value="AdminService"/>
<parameter name="enableRemoteAdmin" value="false"/>
<parameter name="className" value="org.apache.axis.utils.Admin"/>
</service>
<service name="Version" provider="java:RPC">
<parameter name="allowedMethods" value="getVersion"/>
<parameter name="className" value="org.apache.axis.Version"/>
</service>
<!-- ======================以上內容一般不需要修改===========================-->
<!-- ======================================================================
Services:Demo,此段包含Sevice配置實例
=======================-->
<!--
示例1: 簡單 Service
情境: 包含下例代碼中基本屬性.所有參數傳遞均爲元數據,即int、float、double、String、boolean等非對象數據;
可以訪問此Service中所有的方法
引用: 在C#中藉助於IDE引用。
-->
<service name="cityService" provider="java:RPC"> <!-- name: 此WebService的名稱;provider:工作模式 -->>
<parameter name="className" value="com.ithzk.CityService"/><!-- 此Service對應的實現類 -->
<parameter name="allowedMethods" value="*"/><!-- 可以訪問這個Service中所有的方法 -->
</service>
<!-- ======================以下內容一般不需要修改===========================-->
<transport name="http">
<parameter name="qs:list"
value="org.apache.axis.transport.http.QSListHandler"/>
<parameter name="qs:method"
value="org.apache.axis.transport.http.QSMethodHandler"/>
<parameter name="qs:wsdl"
value="org.apache.axis.transport.http.QSWSDLHandler"/>
<requestFlow>
<handler type="URLMapper"/>
<handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler">
</handler>
</requestFlow>
</transport>
<transport name="local">
<responseFlow>
<handler type="LocalResponder"/>
</responseFlow>
</transport>
</deployment>
這個時候我們將該項目利用tomcat啓動,訪問http://localhost:port/webservice_axis/services
可以發現我們的Web Service已經發布成功了,這裏可以先通過瀏覽器調用看下效果
http://localhost:port/webservice_axis/services/cityService?method=getCity&args=ws
第一個參數是需要調用的接口方法,第二個是傳遞的參數
可以看到我們瀏覽器和服務端後臺都給我們返回了我們想要的結果,接下來看一下如何去通過代碼調用
首先導入相關依賴包
pom.xml
<dependency>
<groupId>axis</groupId>
<artifactId>axis</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>axis</groupId>
<artifactId>axis-wsdl4j</artifactId>
<version>1.5.1</version>
</dependency>
CityClient.java
package com.ithzk;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import javax.xml.namespace.QName;
import java.net.URL;
/**
* Axis客戶端
* @author hzk
* @date 2018/7/18
*/
public class CityClient {
public static void main(String[] args){
Service service = new Service();
try {
Call call = (Call) service.createCall();
//設置wsdl地址
call.setTargetEndpointAddress(new URL("http://localhost:8088/webservice_axis/services/cityService?wsdl"));
//設置要執行的方法
call.setOperationName(new QName("http://com","getCity"));
//設置要傳入參數,如果沒有要傳入的參數,則不要寫這個
call.addParameter("msg", org.apache.axis.Constants.XSD_STRING,javax.xml.rpc.ParameterMode.IN);
//設置返回的類型
call.setReturnType(org.apache.axis.Constants.XSD_STRING);
String name = "從此過客";
//調用webservice
String result = (String) call.invoke(new Object[]{name});
System.out.println("Response:"+result);
} catch (Exception e) {
e.printStackTrace();
}
}
}
可以看到通過Axis包提供的幾個類和方法就能完成服務的調用,這裏給大家介紹幾篇博客,個人感覺寫的還不錯
利用Apache AXIS 1 發佈WebService
最詳細的WSDD配置文件註釋
Apache Axis配置文件WSDD詳解
4.WSDL使用實體類生成
我們發佈了服務之後,通過webservice提供的wsdl文件利用wsimport生成客戶端調用需要的實體類
但是有些編碼格式wsimport方式是不支持編譯的,對wsdl瞭解的同學可以自己根據wsdl手動編寫使用類
當然也可以通過IDE工具輔助生成
這裏是一份自己寫的服務提供出來的wsdl,下面通過工具生成出對應所需代碼
4.1 Eclipse
新建一個wsdl文件,然後將遠程的copy到本地
右鍵點擊wsdl文件->Web Service->Generate Java Bean Skeleton
接着就能發現我們已經拿到了需要使用的Java Bean了,然後倒入響應的包就可以使用了
4.2 Idea
通過這樣幾步也可以快速生成出對應的Java Bean代碼
4.3 SOAP-UI
這裏接觸過這款軟件的同學應該知道除了帶有各種強大的模擬請求功能也帶有生成Java Bean的功能
而且同樣支持各種方式例:Axis1,Axis2,CXF....
具體方式看下面這篇博客,對SOAP-UI也作有簡單的介紹