webService

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接口文檔

webXml1.png
webXml2.png

查看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的方法

webXml3.png

例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"," ");

}

}
webXml5.png

例2:簡單解析xml里的內(nèi)容輸出城市天氣情況

  ![exp2-1.png](https://upload-images.jianshu.io/upload_images/18258870-019110cdd5e5b408.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

不想得到所有的信息纠脾,那么我們可以在服務(wù)上找到我們想要對應(yīng)的數(shù)據(jù)

exp2-2.png
exp2-3.png

復雜的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框架

axis1.png
axis2.png

服務(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文件

axis3.png

選擇要供別人調(diào)用的方法

axis4.png

添加Apache axis的庫

axis5.png

配置一個Tomcat

裝有Tomcat會自動添加Application server殷绍,否則手動下載添加路徑;

配置HTTP port 和 JMX port

axis6.png

可訪問的wsdl說明文檔

axis7.png

客戶端調(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.

解決方案:

repair1.png

正常結(jié)果:

test2.png

調(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ù)對比

compare.png
  • 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)消息回給客戶端。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末痰洒,一起剝皮案震驚了整個濱河市瓢棒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌丘喻,老刑警劉巖脯宿,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異泉粉,居然都是意外死亡连霉,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進店門嗡靡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來跺撼,“玉大人,你說我怎么就攤上這事讨彼∏妇” “怎么了?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵哈误,是天一觀的道長哩至。 經(jīng)常有香客問我,道長蜜自,這世上最難降的妖魔是什么菩貌? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮重荠,結(jié)果婚禮上箭阶,老公的妹妹穿的比我還像新娘。我一直安慰自己戈鲁,他們只是感情好尾膊,可當我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著荞彼,像睡著了一般冈敛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鸣皂,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天抓谴,我揣著相機與錄音暮蹂,去河邊找鬼癌压。 笑死仰泻,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的滩届。 我是一名探鬼主播集侯,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼帜消!你這毒婦竟也來了棠枉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤泡挺,失蹤者是張志新(化名)和其女友劉穎辈讶,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體娄猫,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡贱除,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了媳溺。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片月幌。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖悬蔽,靈堂內(nèi)的尸體忽然破棺而出扯躺,到底是詐尸還是另有隱情,我是刑警寧澤屯阀,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布缅帘,位于F島的核電站轴术,受9級特大地震影響难衰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜逗栽,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一盖袭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧彼宠,春花似錦鳄虱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至摧冀,卻和暖如春倍踪,著一層夾襖步出監(jiān)牢的瞬間系宫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工建车, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留扩借,地道東北人。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓缤至,卻偏偏與公主長得像潮罪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子领斥,可洞房花燭夜當晚...
    茶點故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內(nèi)容