webservice學習記錄01
Webservice
Webservice就是一種遠端呼叫技術,他的作用就是從遠端系統中獲取業務資料
1 課程安排
1.1 什麼是webservice
1.2 Webservice入門程式
1.3 Webservice的應用場景
1.4 Webservice的三要素
1.5 WSDL:web服務描述語言
1.6 SOAP:簡單物件訪問協議
1.7 UDDI:目錄服務
1.8 Webservice的四種客戶端呼叫方式
1.9 生成客戶端呼叫方式
1.10 客戶端程式設計呼叫方式
1.11 HttpURLConnecton呼叫方式
1.12 Ajax呼叫方式
1.13 深入開發:用註解修改WSDL內容
2 什麼是webservice
2.1 什麼是遠端呼叫技術
遠端呼叫資料定義:是系統和系統之間的呼叫
2.2 Webservice的原理圖
- Webservice是使用Http傳送SOAP協議的資料的一種遠端呼叫技術
- Webservice要開發服務端
- Webservice要開發客戶端
- Webservice客戶端開發需要閱讀服務端的使用說明書(WSDL)
3 Webservice的入門程式
3.1 需求
- 服務端:釋出一個天氣查詢服務,接收客戶端城市名,返回天氣資料給客戶端
- 客戶端:傳送城市名稱給服務端,接收服務端的返回天氣資料,列印
3.2 環境
- JDK:1.6
- MyEclipse:10.0
3.3 實現
3.3.1 服務端:
開發步驟:
第一步:建立SEI(Service Endpoint Interface)介面,本質上就是Java介面
package cn.itcast.ws.jaxws.ws;
/**
* SEI介面
* @author Administrator
*
*/
public interface WeatherInterface {
public String queryWeather(String cityName);
}
第二步:建立SEI實現類,在實現類上加入@WebService
package cn.itcast.ws.jaxws.ws; import javax.jws.WebService; import javax.jws.soap.SOAPBinding; import javax.jws.soap.SOAPBinding.Style; import javax.xml.ws.BindingType; //SEI實現類 //@WebService表示該類是個服務類,需要釋出其中的public方法 @WebService @SOAPBinding(style = SOAPBinding.Style.RPC)(jdk1.6需要宣告,否則啟動會報錯,jdk1.7就不需要了) //如何實現釋出soap1.2版本協議的服務端程式(Jaxws不支援SOAP1.2服務端釋出,如果想釋出SOAP1.2服務端,需要在服務端引入第三方JAR(jaxws-ri-2.2.8)) //@BindingType(javax.xml.ws.soap.SOAPBinding.SOAP12HTTP_BINDING) public class WeatherInterfaceImpl implements WeatherInterface { @Override public String queryWeather(String cityName) { System.out.println("from client...."+cityName); String weather="晴"; return weather; } }
第三步:釋出服務,Endpoint釋出服務,publish方法,兩個引數:1.服務地址;2.服務實現類
package cn.itcast.ws.jaxws.ws;
import javax.xml.ws.Endpoint;
//天氣服務端
//當使用jdk1.6釋出WebService時,如果不指定@SOAPBinding(style = SOAPBinding.Style.RPC)遇到錯誤
public class WeatherServer {
public static void main(String[] args) {
//Endpoint釋出服務
//引數解釋:
//1.address - 服務地址
//2.implementor - 實現類
Endpoint.publish("http://127.0.0.1:12345/weather", new WeatherInterfaceImpl());
System.out.println("服務啟動成功......");
}
}
第四步:測試服務是否釋出成功,通過閱讀使用說明書,確定客戶端呼叫的介面、方法、引數和返回值存在,證明服務釋出成功。
- WSDL地址:服務地址+”?wsdl”
- WSDL閱讀方式:從下往上
3.3.2 客戶端:
開發步驟
第一步:wsimport命令生成客戶端程式碼(wsimport將在下面詳細介紹)
第二步:根據使用說明書,使用客戶端程式碼呼叫服務端
- 第一步:建立服務檢視,檢視是從service標籤的name屬性獲取
- 第二步:獲取服務實現類,實現類從portType的name屬性獲取
- 第三步:獲取查詢方法,從portType的operation標籤獲取
package cn.itcast.ws.jaxws.ws.client;
import cn.itcast.ws.jaxws.ws.WeatherInterfaceImpl;
import cn.itcast.ws.jaxws.ws.WeatherInterfaceImplService;
//天氣查詢客戶端
//jdk版本不同利用wsimport命令生成的客戶端程式碼也不相同,但功能一致
public class WeatherClient {
public static void main(String[] args) {
//建立服務檢視
WeatherInterfaceImplService weatherInterfaceImplService = new WeatherInterfaceImplService();
//獲取服務實現類
WeatherInterfaceImpl weatherInterfaceImpl = weatherInterfaceImplService.getPort(WeatherInterfaceImpl.class);
//呼叫查詢方法,列印
String weather = weatherInterfaceImpl.queryWeather("北京");
System.out.println("客戶端呼叫伺服器端成功...........");
System.out.println("查詢出的天氣資訊為:"+weather);
}
}
3.4 Webservice的優缺點
優點:
- 傳送方式採用http的post傳送,http的預設埠是80,防火牆預設不攔截80,所以跨防火牆
- 採用XML格式封裝資料,XML是跨平臺的,所以webservice也可以跨平臺。
- Webservice支援面向物件
缺點:
- 採用XML格式封裝資料,所以在傳輸過程中,要傳輸額外的標籤,隨著SOAP協議的不斷完善,標籤越來越大,導致webservice效能下降
4 Webservice應用場景
4.1 軟體整合和複用
4.2 適用場景
- 釋出一個服務(對內/對外),不考慮客戶端型別,不考慮效能,建議使用webservice
- 服務端已經確定使用webservice,客戶端不能選擇,必須使用webservice
4.3 不適用場景
- 考慮效能時不建議使用webservice
- 同構程式下不建議使用webservice,比如java用RMI,不需要翻譯成XML的資料
5 WSDL
5.1 定義
WSDL及web服務描述語言,他是webservice服務端使用說明書,說明服務端介面、方法、引數和返回值,WSDL是隨服務釋出成功,自動生成,無需編寫
5.2 文件結構
- <service> 服務檢視,webservice的服務結點,它包括了服務端點
- <binding> 為每個服務端點定義訊息格式和協議細節
- <portType> 服務端點,描述 web service可被執行的操作方法,以及相關的訊息,通過binding指向portType
- <message> 定義一個操作(方法)的資料引數(可有多個引數)
- <types> 定義 web service使用的全部資料型別
5.3 閱讀方式:從下往上
6 SOAP
6.1 定義:
- SOAP即簡單物件訪問協議,他是使用http傳送的XML格式的資料,它可以跨平臺,跨防火牆,SOAP不是webservice的專有協議。
- SOAP=http+xml
6.2 協議格式
- 必需有 Envelope 元素,此元素將整個 XML 文件標識為一條SOAP訊息
- 可選的 Header 元素,包含頭部資訊
- 必需有Body 元素,包含所有的呼叫和響應資訊
- 可選的 Fault 元素,提供有關在處理此訊息所發生錯誤的資訊
6.3 TCP/IP Monitor(瞭解,抓取請求與返回資訊)
6.3.1 代理原理
6.3.2 配置
6.3.3 測試
在瀏覽器中輸入代理服務地址,能正常訪問,代表代理服務器設定成功
6.4 SOAP1.1
請求:
POST /weather HTTP/1.1
Accept: text/xml, multipart/related
Content-Type: text/xml; charset=utf-8
SOAPAction: "http://ws.jaxws.ws.itcast.cn/WeatherInterfaceImpl/queryWeatherRequest"
User-Agent: JAX-WS RI 2.2.4-b01
Host: 127.0.0.1:54321
Connection: keep-alive
Content-Length: 214
<?xml version="1.0" ?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body><ns2:queryWeather xmlns:ns2="http://ws.jaxws.ws.itcast.cn/"><arg0>北京</arg0></ns2:queryWeather>
</S:Body>
</S:Envelope>
響應:
HTTP/1.1 200 OK
Transfer-encoding: chunked
Content-type: text/xml; charset=utf-8
Date: Thu, 26 Nov 2015 03:14:29 GMT
<?xml version="1.0" ?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns2:queryWeatherResponse xmlns:ns2="http://ws.jaxws.ws.itcast.cn/"><return>晴</return></ns2:queryWeatherResponse>
</S:Body>
</S:Envelope>
6.5 SOAP1.2
如何釋出SOAP1.2服務端?
- Jaxws不支援SOAP1.2服務端釋出,直接釋出會報如下異常
- 如果想釋出SOAP1.2服務端,需要在服務端引入第三方JAR(jaxws-ri-2.2.8)
- 在實現類上加入如下註解
@BindingType(SOAPBinding.SOAP12HTTP_BINDING)
請求:
POST /weather HTTP/1.1
Accept: application/soap+xml, multipart/related
Content-Type: application/soap+xml; charset=utf-8;
action="http://ws.jaxws.ws.itcast.cn/WeatherInterfaceImpl/queryWeatherRequest"
User-Agent: JAX-WS RI 2.2.4-b01
Host: 127.0.0.1:54321
Connection: keep-alive
Content-Length: 212
<?xml version="1.0" ?>
<S:Envelope xmlns:S="http://www.w3.org/2003/05/soap-envelope">
<S:Body><ns2:queryWeather xmlns:ns2="http://ws.jaxws.ws.itcast.cn/"><arg0>北京</arg0></ns2:queryWeather>
</S:Body>
</S:Envelope>
響應
HTTP/1.1 200 OK
Transfer-encoding: chunked
Content-type: application/soap+xml; charset=utf-8
Date: Thu, 26 Nov 2015 03:25:24 GMT
<?xml version='1.0' encoding='UTF-8'?>
<S:Envelope xmlns:S="http://www.w3.org/2003/05/soap-envelope">
<S:Body>
<ns2:queryWeatherResponse xmlns:ns2="http://ws.jaxws.ws.itcast.cn/"><return>晴</return></ns2:queryWeatherResponse>
</S:Body>
</S:Envelope>
6.6 SOAP1.1和SOAP1.2區別
相同點:
- 請求傳送方式相同:都是使用POST
- 協議內容相同:都有Envelope和Body標籤
不同點:
- 資料格式不同:content-type不同
SOAP1.1:text/xml;charset=utf-8
SOAP1.2:application/soap+xml;charset=utf-8
- 名稱空間不同:
SOAP1.1:http://schemas.xmlsoap.org/soap/envelope/
SOAP1.2:http://www.w3.org/2003/05/soap-envelope
7 UDDI
UDDI 是一種目錄服務,企業可以使用它對 Web services 進行註冊和搜尋。UDDI,英文為"Universal Description, Discovery and Integration",可譯為“通用描述、發現與整合服務”。
UDDI 並不像 WSDL 和 SOAP 一樣深入人心,因為很多時候,使用者知道 Web服務的位置(通常位於公司的企業內部網中)。
8 課程回顧
什麼是webservice?”
- 什麼是遠端呼叫,系統和系統之間的呼叫,從遠端系統當中獲取業務資料。
- Webservice是web服務,他是用http傳輸SOAP協議資料的一種遠端呼叫技術
Webservice入門程式
服務端
- 第一步:建立SEI介面
- 第二步:建立SEI實現類,要在類上加入@WebService
- 第三步:釋出服務,Endpoint的publish方法,2兩個引數:1.服務地址;2.實現類例項
- 第四步:測試服務是否釋出成功,通過閱讀使用說明書,確定服務介面、方法、引數、返回值存在,說明服務釋出成功。
WSDL地址:服務地址+”?wsdl”
WSDL閱讀方式,從下往上,servvice->binding->portType->其中有介面、方法、引數和返回值
客戶端
- 第一步:使用wsimport生成客戶端程式碼
- 第二步:根據使用說明書,使用客戶端呼叫服務端
- 建立服務檢視,檢視是從service的name屬性獲取
- 獲取服務實現類,從portType的name屬性獲取
- 呼叫查詢方法,從portType下的operation標籤的name屬性獲取
優缺點:
- 傳送方式採用http的post,http預設埠是80,所以跨越防火牆
- 資料封裝使用XML格式,XML是跨平臺,所以webservice可以跨平臺
- Webservice支援面向物件開發
Webservice應用場景
軟體整合和複用
適用場景:
- 釋出服務(對內/對外),不考慮效能,不考慮客戶端型別,建議使用webservice
- 服務端已確定使用webservice,客戶端只能使用webservice
不適用場景:
- 考慮效能時,不建議使用webservice
- 同構程式下,不建議使用webservice,比如客戶端服務端都是java開發,建議Java RMI
WSDL
定義:WSDL即Web服務描述語言,他是webservice服務端的使用說明書,他說明服務端介面、方法、引數和返回值,他是隨服務釋出成功,自動生成,無需編寫
文件結構:
- Service
- Binding
- portType
- message
- types
閱讀方式:從下往上
SOAP
定義:SOAP即簡單物件訪問協議,他是使用http傳送的XML格式的資料,跨平臺、跨防火牆,他不是webservice的專有協議
SOAP=http+xml
協議的格式:
- 必須有:envelope和body
- 非必有:header和fault
SOAP1.1和1.2區別:
相同點:
- 都使用http的POST傳送請求
- 協議的格式都相同:都有envelope標籤和body標籤
不同點:
Content-type:
SOAP1.1:text/xml;charset=utf-8;
SOAP1.2:application/soap+xml;charset=utf-8
名稱空間不同:
UDDI:就是一個目錄服務,提供搜尋和註冊功能,因為不常用,所以瞭解下就可以了。
9 Webservice的四種客戶端呼叫方式
公網服務地址:
9.1 第一種生成客戶端呼叫方式
9.1.1 Wsimport命令介紹
- Wsimport就是jdk提供的的一個工具,他作用就是根據WSDL地址生成客戶端程式碼
- Wsimport位置JAVA_HOME/bin
- Wsimport常用的引數:
-s,生成java檔案的
-d,生成class檔案的,預設的引數(即無論寫不寫都會有class檔案生成)
-p,指定包名的,如果不加該引數,預設包名就是wsdl文件中的名稱空間的倒序(-p如果使用一定要放在-s和-d前)
- Wsimport僅支援SOAP1.1客戶端的生成
9.1.2 呼叫公網手機號歸屬地查詢服務
第一步:wsimport生成客戶端程式碼
wsimport -p cn.itcast.mobile -s . http://webservice.we
bxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl
第二步:閱讀使用說明書,使用生成客戶端程式碼呼叫服務端
package cn.itcast.mobile.client;
import cn.itcast.mobile.MobileCodeWS;
import cn.itcast.mobile.MobileCodeWSSoap;
//公網手機號查詢客戶端
public class MobileClient {
public static void main(String[] args) {
//建立服務試圖
MobileCodeWS mobileCodeWS = new MobileCodeWS();
//獲取服務實現累
MobileCodeWSSoap mobileCodeWSSoap = mobileCodeWS.getPort(MobileCodeWSSoap.class);
//使用查詢方法
String mobileInfo = mobileCodeWSSoap.getMobileCodeInfo("18895626618", "");
System.out.println(mobileInfo);
}
}
9.1.3 公網天氣服務端查詢
會提示報錯,把wsdl網頁另存到本地,然後刪除無法解析的部分
D:\Workspaces\傳智播客webservice學習\wsimport\src>wsimport -p cn.itcast.weather
-s . file:///C:\Users\Administrator\Desktop\WeatherWS.asmx.xml
package cn.itcast.weather.client;
import java.util.List;
import cn.itcast.weather.ArrayOfString;
import cn.itcast.weather.WeatherWS;
import cn.itcast.weather.WeatherWSSoap;
//公網天氣查詢客戶端
public class WeatherClient {
public static void main(String[] args) {
WeatherWS weatherWS = new WeatherWS();
WeatherWSSoap weatherWSSoap = weatherWS.getPort(WeatherWSSoap.class);
ArrayOfString arrayOfString = weatherWSSoap.getWeather("廣州", "");
List<String> list = arrayOfString.getString();
for(String str : list){
System.out.println(str);
}
}
}
9.1.4 特點
該種方式使用簡單,但一些關鍵的元素在程式碼生成時寫死到生成程式碼中,不方便維護,所以僅用於測試。
10 第二種:service程式設計呼叫方式
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import cn.itcast.mobile.MobileCodeWSSoap;
//service方式程式設計webservice
//注意也需要生成客戶端,只是不通過自己生成的客戶端來建立檢視
public class MobileClient {
public static void main(String[] args) {
//建立wsdl的url,注意不是服務地址
URL wsdlDocumentLocation=null;
try {
wsdlDocumentLocation = new URL("http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?WSDL");
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//建立服務名稱
//1.namespaceURI - 名稱空間地址
//2.localPart - 服務檢視名
QName serviceName = new QName("http://WebXml.com.cn/", "MobileCodeWS");
//建立服務檢視
//引數解釋
//1.wsdlDocumentLocation - wsdl地址
//2.serviceName - 服務名稱
Service service = Service.create(wsdlDocumentLocation, serviceName);
//獲取服務實現類
MobileCodeWSSoap mobileCodeWSSoap = service.getPort(MobileCodeWSSoap.class);
String mobileInfo = mobileCodeWSSoap.getMobileCodeInfo("18888888888", "");
System.out.println(mobileInfo);
}
}
10.1 特點
該種方式可以自定義關鍵元素,方便以後維護,是一種標準的開發方式
11 第三種:HttpURLConnection呼叫方式
開發步驟:
第一步:建立服務地址
第二步:開啟一個通向服務地址的連線
第三步:設定引數
設定POST,POST必須大寫,如果不大寫,報如下異常
如果不設定輸入輸出,會報如下異常
第四步:組織SOAP資料,傳送請求
第五步:接收服務端響應,列印
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
//利用HttpURLConnection呼叫方式(可以不生成客戶端)
public class HttpCilent {
public static void main(String[] args) throws IOException {
//第一步:建立服務地址,注意是服務地址不是wsdl地址
URL url = new URL("http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx");
//第二步:開啟一個通向服務地址的連線
HttpURLConnection httpURLConnenction = (HttpURLConnection)url.openConnection();
//第三步:設定引數
//3.1傳送方式設定:POST
httpURLConnenction.setRequestMethod("POST");
//3.2設定資料格式:content-type
httpURLConnenction.setRequestProperty("content-type", "text/xml;charset=utf-8");
//3.3設定輸入和輸出,因為預設新建立httpURLConnenction沒有讀寫許可權
httpURLConnenction.setDoInput(true);
httpURLConnenction.setDoOutput(true);
//第四步:組織SOAP資料,傳送請求
String soapXML = getXML("15226466316");
OutputStream os = httpURLConnenction.getOutputStream();
os.write(soapXML.getBytes());
//第五步:接受伺服器相應,列印
int responseCode = httpURLConnenction.getResponseCode();
if(responseCode == 200){ //表示服務端相相應成功
InputStream is = httpURLConnenction.getInputStream();
//is.read();這種直接操作二進位制容易出現亂碼
//字元流(裝飾設計模式)
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
StringBuilder sb = new StringBuilder();
String temp = null;
while((temp= br.readLine()) != null){
sb.append(temp);
}
System.out.println(sb.toString());
br.close();
isr.close();
is.close();
os.close();
}
}
/**
* <?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<getMobileCodeInfo xmlns="http://WebXml.com.cn/">
<mobileCode>string</mobileCode>
<userID>string</userID>
</getMobileCodeInfo>
</soap:Body>
</soap:Envelope>
*/
public static String getXML(String phoneNum){
//模擬生成xml
String soapXML="<?xml version=\"1.0\" encoding=\"utf-8\"?>"
+"<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"
+"<soap:Body>"
+"<getMobileCodeInfo xmlns=\"http://WebXml.com.cn/\">"
+"<mobileCode>"+phoneNum+"</mobileCode>"
+"<userID></userID>"
+"</getMobileCodeInfo>"
+"</soap:Body>"
+"</soap:Envelope>";
return soapXML;
}
}
12 Ajax呼叫方式
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script type="text/javascript">
function queryMobile(){
//建立XMLHttpRequest物件(這裡沒有考慮瀏覽器相容問題)
var xhr = new XMLHttpRequest();
//開啟連線
xhr.open("post","http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx",true);
//設定資料型別
xhr.setRequestHeader("content-type","text/xml;charset=utf-8");
//設定回撥函式
xhr.onreadystatechange=function(){
//判斷是否傳送成功和判斷服務端是否響應成功
if(4 == xhr.readyState && 200 == xhr.status){
alert(xhr.responseText);
}
}
//組織SOAP協議資料
var soapXML = "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
+"<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"
+"<soap:Body>"
+"<getMobileCodeInfo xmlns=\"http://WebXml.com.cn/\">"
+"<mobileCode>"+document.getElementById("phoneNum").value+"</mobileCode>"
+"<userID></userID>"
+"</getMobileCodeInfo>"
+"</soap:Body>"
+"</soap:Envelope>";
alert(soapXML);
//傳送資料
xhr.send(soapXML);
}
</script>
</head>
<body>
手機號查詢:<input type="text" id="phoneNum"/> <input type="button" value="查詢" onclick="javascript:queryMobile();"/>
</body>
</html>
13 深入開發:用註解修改WSDL內容
WebService的註解都位於javax.jws包下:
[email protected]定義服務,在public class上邊
- targetNamespace:指定名稱空間
- name:portType的名稱
- portName:port的名稱
- serviceName:服務名稱
- endpointInterface:SEI介面地址,如果一個服務類實現了多個介面,只需要釋出一個介面的方法,可通過此註解指定要釋出服務的介面。
[email protected]定義方法,在公開方法上邊
- operationName:方法名
- exclude:設定為true表示此方法不是webservice方法,反之則表示webservice方法,預設是false
[email protected]定義返回值,在方法返回值前邊
- name:返回結果值的名稱
[email protected]定義引數,在方法引數前邊
- name:指定引數的名稱
作用:
通過註解,可以更加形像的描述Web服務。對自動生成的wsdl文件進行修改,為使用者提供一個更加清晰的wsdl文件。
當修改了WebService註解之後,會影響客戶端生成的程式碼。呼叫的方法名和引數名也發生了變化
package cn.itcast.ws.jaxws.ws;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;
import javax.xml.ws.BindingType;
//SEI實現類
//@WebService表示該類是個服務類,需要釋出其中的public方法(要不要wsdl優化@WebService都必須要有)
@WebService(targetNamespace="http://service.cn.itcast",
name="WeatherWSSoap",
portName="WeatherWSSoapPort",
serviceName="WeatherWS")
@SOAPBinding(style = SOAPBinding.Style.RPC)
//如何實現釋出soap1.2版本協議的服務端程式(Jaxws不支援SOAP1.2服務端釋出,如果想釋出SOAP1.2服務端,需要在服務端引入第三方JAR(jaxws-ri-2.2.8))
//@BindingType(javax.xml.ws.soap.SOAPBinding.SOAP12HTTP_BINDING)
public class WeatherInterfaceImpl implements WeatherInterface {
@WebMethod(
operationName="getWeather",
exclude=false
)
@Override
public @WebResult(name="result")String queryWeather(@WebParam(name="cityName") String cityName) {
System.out.println("from client...."+cityName);
String weather="晴";
return weather;
}
}