1.基本介紹
webService是啥(概念介紹),為什么要看webService(選題原因)粘勒,這個webService是干什么的(用途)烘嘱,怎么使用。
1.1概念介紹
基于Web的服務(wù):服務(wù)器端整出一些資源讓客戶端應(yīng)用訪問(獲取數(shù)據(jù))
一個跨語言、跨平臺的規(guī)范(抽象)
多個跨平臺赤惊、跨語言的應(yīng)用間通信整合的方案(實際)
1.2選題原因
你想在web或App上調(diào)用銀行別人的支付接口吼旧,你的開發(fā)語言又是五花八門。這個時候調(diào)用接口方法就可以使用webService未舟。
1.3應(yīng)用場景:
如果我們的網(wǎng)站需要提供一個天氣預報這樣一個需求的話圈暗,那我們該怎么做。
天氣預報這么一個功能并不是簡單的JS組件就能夠?qū)崿F(xiàn)的裕膀,它的數(shù)據(jù)是依賴數(shù)據(jù)庫分析出來的员串,甚至需要衛(wèi)星探測。
這個時候webService就誕生了昼扛,webservice就是一個部署在Web服務(wù)器上的寸齐,它向外界暴露出一個能夠通過Web進行調(diào)用的API。也就是說:當我們想要獲取天氣預報的信息抄谐,我們可以調(diào)用別人寫好的service服務(wù)渺鹦,我們調(diào)用就能夠得到結(jié)果了。也就能返回數(shù)據(jù)蛹含,而不是搜索引擎中加工處理后的html網(wǎng)頁了毅厚。
學習WebService可以將你的服務(wù)(一段代碼)發(fā)布到互聯(lián)網(wǎng)上讓別人去調(diào)用,也可以調(diào)用別人機器上發(fā)布的WebService,就像使用自己的代碼一樣。
1.4示例:
怎么調(diào)用別人發(fā)布暴露出來的webservice接口
調(diào)用別人發(fā)布的WebService服務(wù)浦箱,首先需要找到對方的WSDL文檔(webService說明文檔)吸耿,了解調(diào)取的路徑和方式,傳統(tǒng)webService調(diào)用成功后會返回xml格式信息酷窥。
尋找官方webService接口文檔
查看WSDL
先看service標簽咽安,看相應(yīng)port的binding屬性,然后通過值查找上面的binding標簽蓬推。
通過binding標簽可以獲得具體協(xié)議等信息板乙,然后查看binding的type屬性。
通過binding的type屬性,查找對應(yīng)的portType募逞,可以獲得可操作的方法和參數(shù)蛋铆、返回值等。
通過portType下的operation標簽的message屬性放接,可以向上查找message獲取具體的數(shù)據(jù)參數(shù)信息刺啦。
也可以直接通過平臺的指示信息掌握閱讀wsdl的方法
例1:get請求獲取手機號碼相關(guān)信息
public class User {
public static void get(String mobileCode ,String userID ) throws Exception{
URL url=new URL("http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx/getMobileCodeInfo?mobileCode="+mobileCode+
"&userID="+userID);
HttpURLConnection conn=(HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5000);
conn.setRequestMethod("GET");
if(conn.getResponseCode()==HttpURLConnection.HTTP_OK){ //結(jié)果碼=200
InputStream is=conn.getInputStream();
//內(nèi)存流 ,
ByteArrayOutputStream boas=new ByteArrayOutputStream();
byte[] buffer=new byte[1024];
int len=-1;
while((len=is.read(buffer))!=-1){
boas.write(buffer, 0, len);
}
System.out.println("GET請求獲取的數(shù)據(jù):"+boas.toString());
boas.close();
is.close();
}
}
public static void main(String[] args) throws Exception
{
get("15072401562"," ");
}
}
例2:簡單解析xml里的內(nèi)容輸出城市天氣情況

不想得到所有的信息纠脾,那么我們可以在服務(wù)上找到我們想要對應(yīng)的數(shù)據(jù)
復雜的xml格式可以通過DOM解析和SAX解析方法
- DOM解析
根據(jù)xml層級結(jié)構(gòu)在內(nèi)存中分配一個樹形結(jié)構(gòu)得哆,把xml標簽、屬性钧敞、文本都封裝成對象
- SAX解析
采用事件驅(qū)動胳蛮,邊讀邊解析,從上到下慧脱,讀到某一對象渺绒,返回名稱
通過webService的方式發(fā)布接口供別人調(diào)用
把公司內(nèi)部系統(tǒng)的業(yè)務(wù)方法發(fā)布成WebService服務(wù),供遠程合作單位和個人調(diào)用菱鸥。(借助一些WebService框架可以很輕松地把自己的業(yè)務(wù)對象發(fā)布成WebService服務(wù)宗兼,Java方面的典型WebService框架包括:axis,xfire氮采,cxf 等)
IDEA創(chuàng)建webService的axis框架
服務(wù)端代碼
public class HelloWorld {
public String palyBefore(String before) {
String result = "--------運動前---------" + before;
System.out.println(result);
return result;
}
public String play(String play){
String result = "--------運動中---------" + play;
System.out.println(result);
return result;
}
public String playAfter(String after){
String result = "--------運動后---------" + after;
System.out.println(result);
return result;
}
}
生成WSDL文件
選擇要供別人調(diào)用的方法
添加Apache axis的庫
配置一個Tomcat
裝有Tomcat會自動添加Application server殷绍,否則手動下載添加路徑;
配置HTTP port 和 JMX port
可訪問的wsdl說明文檔
客戶端調(diào)用發(fā)布的方法
注(測試為了方便直接在同一框架下寫的客戶端類鹊漠,其實也是需要搭建Axis框架的)
public class WebServiceClient {
public static void main(String[] args){
String url = null;
String method = null;
String[] params = null;
//設(shè)置入?yún)?
url = "http://localhost:8089/webservice_war_exploded/services/HelloWorld";
method = "play";
params = new String[]{"伸腰,踢腿"};
WebServiceClient wsClient = new WebServiceClient();
String result = wsClient.send(url,method,params);
System.out.println(result);
}
public String send(String url,String method,Object[] params){
if (StringUtils.isEmpty(url))
return "url地址為空";
if (StringUtils.isEmpty(method))
return "method方法名為空";
String result = null;
Call call = null;
try {
//創(chuàng)建webservice調(diào)用實例
Service service = new Service();
call = (Call) service.createCall();
call.setTargetEndpointAddress(new URL(url));
call.setOperationName(method);
//執(zhí)行方法
result = (String)call.invoke(params);
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
可能出現(xiàn)的問題
org.xml.sax.SAXException: SimpleDeserializer encountered a child element, which is NOT expected, in something it was trying to deserialize.
解決方案:
正常結(jié)果:
調(diào)用成功主到!
2.相關(guān)概念介紹
webService設(shè)計到哪些知識點(概念和組成),工作調(diào)用原理躯概。
2.1涉及的概念
- http(超文本傳輸協(xié)議):
是一個客戶端和服務(wù)器端請求和應(yīng)答的標準(TCP)镰烧。http協(xié)議其目的是為了提供一種發(fā)布和接收htttp頁面的方法。http是純文本格式楞陷。
- Soap(簡單對象訪問協(xié)議):
它描述了一種在分散或分布式的環(huán)境中如何交換信息的輕量級協(xié)議怔鳖。soap在http協(xié)議的基礎(chǔ)上,一個基于XML的協(xié)議固蛾。soap包是XML格式结执。
SOAP協(xié)議可以簡單地理解為:SOAP=RPC+HTTP+XML,即采用HTTP作為通信協(xié)議艾凯,RPC(遠程過程調(diào)用協(xié)議)作為一致性的調(diào)用途徑献幔,XML作為數(shù)據(jù)傳送的格式,從而允許服務(wù)提供者和服務(wù)客戶經(jīng)過防火墻在Internet上進行通信交互趾诗。
- Json(JavaScript Object Notation, JS對象簡譜):
javascript對象標記方法蜡感,一種輕量級的數(shù)據(jù)交換格式蹬蚁,是JavaScript的子集,由于是一種語言層面的規(guī)范郑兴,因此得以更好地在客戶端解析使用犀斋。數(shù)據(jù)格式:數(shù)字、布爾情连、字符串(雙引號)叽粹、對象、數(shù)組却舀、null虫几。
- XML(可擴展標記語言):
優(yōu)點在于描述數(shù)據(jù)凸顯其結(jié)構(gòu)性,亦即其UI性挽拔,在良好的UI層面增加新元素非常簡單而清晰辆脸。
描述一個實體(person),沒有限定屬性或者子元素來定義實體的屬性(身高螃诅,年齡啡氢,性別等等),帶來了很多的靈活性州刽,也造成了不同程序之間的差異習慣,可擴展意味著"多形態(tài)",某種層面的不統(tǒng)一浪箭。
當服務(wù)端發(fā)送XML文檔至客戶端后穗椅,需要客戶端做解析為DOM樹再做節(jié)點遍歷來獲取數(shù)據(jù)。
XML格式和JSON格式的數(shù)據(jù)對比
- WSDL(web service definition language)
WSDL是webservice定義語言, 對應(yīng).wsdl文檔, 一個webservice會對應(yīng)一個唯一的wsdl文檔, 定義了客戶端與服務(wù)端發(fā)送請求和響應(yīng)的數(shù)據(jù)格式和過程
2.2WebService 的工作調(diào)用原理
1.服務(wù)器端發(fā)布:
WebService服務(wù)器端首先要通過一個WSDL文件來說明自己有什么服務(wù)可以對外調(diào)用奶栖。簡單的說匹表,WSDL就像是一個說明書,用于描述WebService及其方法宣鄙、參數(shù)和返回值袍镀。WSDL文件保存在Web服務(wù)器上,通過一個url地址就可以訪問冻晤。
2.客戶端調(diào)用:
要調(diào)用一個WebService服務(wù)之前苇羡,要知道該服務(wù)的WSDL文件的地址。WebService服務(wù)提供商可以通過兩種方式來暴露它的WSDL文件地址:1.注冊到UDDI服務(wù)器鼻弧,以便被人查找设江;2.直接告訴給客戶端調(diào)用者。
給這各類WebService客戶端API傳遞wsdl文件的url地址攘轩,這些API就會創(chuàng)建出底層的代理類叉存,調(diào)用這些代理,就可以訪問到webservice服務(wù)度帮。代理類把客戶端的方法調(diào)用變成soap格式的請求數(shù)據(jù)再通過HTTP協(xié)議發(fā)出去歼捏,并把接收到的soap數(shù)據(jù)變成返回值返回。
3.服務(wù)端響應(yīng):
當遠程調(diào)用客戶端給它通過http協(xié)議發(fā)送過來 soap格式的請求數(shù)據(jù)時,它分析這個數(shù)據(jù)瞳秽,就知道要調(diào)用哪個java類的哪個方法瓣履,于是去查找或創(chuàng)建這個對象,并調(diào)用其方法寂诱,再把方法返回的結(jié)果包裝成 soap格式的數(shù)據(jù)拂苹,通過http響應(yīng)消息回給客戶端。