1. 程式人生 > >day46_Webservice學習筆記_02

day46_Webservice學習筆記_02

一、回顧昨天所學

什麼是webservice?    什麼是遠端呼叫技術?答:系統和系統之間的呼叫,從遠端系統當中獲取業務資料。    Webservice是web服務,他是用http傳輸SOAP協議資料的一種遠端呼叫技術。Webservice的入門程式    服務端        第一步:建立SEI介面        第二步:建立SEI實現類,要在類上加入註解:@WebService,作用是標識這個類是服務類,要釋出裡面的public方法。        第三步:釋出服務,Endpoint的publish方法,有2兩個引數:1.服務地址  2.實現類例項        第四步:測試服務是否釋出成功,通過閱讀使用說明書,確定服務介面、方法、引數和返回值存在,說明服務釋出成功。            WSDL地址:服務地址+”?wsdl”,比如:http://127.0.0.1:54321/weather?wsdl
            WSDL閱讀方式,從下往上,service --> binding --> portType --> 其中有介面、方法、引數和返回值    客戶端        第一步:使用wsimport命令生成客戶端程式碼        第二步:根據使用說明書,使用客戶端呼叫服務端            建立服務檢視,檢視是從service的name屬性獲取            獲取服務實現類,從portType的name屬性獲取            呼叫查詢方法,從portType下的operation標籤的name屬性獲取Webservice的優缺點:    優點:傳送方式採用http的post,http預設埠是80
,所以跨防火牆。          資料封裝使用XML格式,XML是跨平臺,所以webservice可以跨平臺。          Webservice支援面向物件開發。    缺點:使用XML封裝資料,需要額外傳輸其他標籤,效能較差。Webservice的應用場景巨集觀    軟體整合和複用微觀    適用場景:        釋出服務(對內/對外),不考慮效能,不考慮客戶端型別,建議使用webservice        服務端已經確定webservice,客戶端只能使用webservice    不適用場景:        考慮效能時,不建議使用webservice        同構程式下,不建議使用webservice,比如:客戶端服務端都是java開發,建議使用Java RMI,Java的RMI同樣可以實現遠端呼叫,而且效能比webservice好很多。Webservice的三要素    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            名稱空間不同:                SOAP1.1:http://schemas.xmlsoap.org/soap/envelope/                SOAP1.2:http://www.w3.org/2003/05/soap-envelopeWebservice的四種客戶端呼叫方式    生成客戶端的呼叫方式    Service程式設計的呼叫方式    HttpURLConnecton呼叫方式    Ajax呼叫方式深入開發:用註解修改WSDL內容    @Webservice    @WebMethod    @WebParam    @WebResult修改完WSDL之後,需要重新生成客戶端程式碼。

二、課程安排

  • CXF的介紹、安裝和配置
  • 使用CXF釋出SOAP1.1協議的服務
    • 使用CXF釋出SOAP1.2協議的服務(瞭解一下)
  • CXF + Spring整合釋出SOAP的服務
  • 使用CXF釋出REST的服務(大企業中使用)
  • 什麼是REST
  • CXF + Spring整合釋出REST的服務
  • 綜合案例:把公網的服務整合到自己開發的系統中,通過呼叫服務實現查詢功能,再把我們做的查詢功能釋出成一個服務,讓外界的人去呼叫。(揹著寫)

三、CXF的介紹、安裝和配置

3.1、CXF的介紹

Apache CXF = Celtix + Xfire,開始叫 Apache CeltiXfire,後來更名為 Apache CXF 了,以下簡稱為 CXF。Apache CXF 是一個開源的web Services 框架,CXF 幫助您快速構建和開發 web Services ,它支援多種協議,比如:SOAP1.1,1,2、XML/HTTP、RESTful HTTP 或者 CORBA。CORBA(Common Object Request Broker Architecture公共物件請求代理體系結構,早期語言使用的WS。C,c++,C#) CXF是基於SOA匯流排結構,依靠spring完成模組的整合,實現SOA方式。靈活的部署:可以執行有Tomcat、Jboss、Jetty(內建)、Weblogic上面。
  • CXF是一個開源的webservice框架,提供很多完善功能,可以實現快速構建和開發。
  • CXF支援的協議:SOAP1.1/1.2、REST(今天要講的)
  • CXF支援資料格式:XML、JSON(僅在REST方式下支援)

3.2、CXF的安裝及配置

  • 下載地址,建議下載最新版本:http://cxf.apache.org/download.html
  • 包結構介紹:
  • 安裝和配置:
  • 第一步:安裝JDK,建議1.8,安裝成功介面
  • 第二步:解壓 apache-cxf-3.2.6.zip 到指定目錄,建立系統環境變數:CXF_HOME
  • 第三步:把CXF_HOME加入到Path路徑下
  • 第四步:測試,在新的cmd命令列視窗下輸入命令:wsdl2java –h,出現如下圖所示介面,表示安裝成功。
  • 如果不想使用IDE(比如:Eclipse),即手動建立專案的方式,需要在環境變數下配置如下資訊:

四、使用CXF釋出SOAP1.1協議的服務

4.1、需求

  • 服務端:釋出服務,接收客戶端的城市名,返回天氣資料給客戶端。
  • 客戶端:傳送城市名給服務端,接收服務端的響應資訊,列印。

4.2、實現-服務端

開發步驟:  第一步:匯入jar包  第二步:建立SEI介面,要在介面上加入註解:@WebService

package com.itheima.webservice.cxf.server;import javax.jws.WebService;/* * SEI介面 */@WebServicepublic interface WeatherInterface {    public String queryWeather(String cityName);}

  第三步:建立SEI實現類

package com.itheima.webservice.cxf.server;/* * SEI實現類 */public class WeatherInterfaceImpl implements WeatherInterface {    @Override    public String queryWeather(String cityName) {        System.out.println("from client..." + cityName);        if ("北京".equals(cityName)) {            return "冷且霾";        } else {            return "暖且晴";        }    }}

  第四步:釋出服務, 使用JaxWsServerFactoryBean釋出服務,需要設定3個引數:1.服務介面; 2.服務實現類; 3.服務地址; Endpoint僅支援釋出實現類,JaxWsServerFactoryBean支援釋出介面。

package com.itheima.webservice.cxf.server;import org.apache.cxf.jaxws.JaxWsServerFactoryBean;/* * 釋出服務端 */public class WeatherServer {    public static void main(String[] args) {        /* JaxWsServerFactoryBean釋出服務,需要設定3個引數:1.服務介面; 2.服務實現類;  3.服務地址;           Endpoint僅支援釋出實現類,JaxWsServerFactoryBean支援釋出介面        */        // JaxWsServerFactoryBean釋出服務        JaxWsServerFactoryBean jaxWsServerFactoryBean = new JaxWsServerFactoryBean();        // 設定服務介面        jaxWsServerFactoryBean.setServiceClass(WeatherInterface.class);        // 設定服務地址        jaxWsServerFactoryBean.setAddress("http://127.0.0.1:12345/weather");            // 設定服務實現類        jaxWsServerFactoryBean.setServiceBean(new WeatherInterfaceImpl());        // 釋出服務        jaxWsServerFactoryBean.create();    }}

  第五步:測試服務是否釋出成功,閱讀使用說明書,確定關鍵點。我們先啟動服務端服務,如下圖所示:

  如果在CXF釋出的服務下,直接訪問服務地址:http://127.0.0.1:12345/weather,會如下異常:  此時直接訪問使用說明書的地址即可:http://127.0.0.1:12345/weather?wsdl,如下圖所示:

4.3、使用CXF釋出SOAP1.2協議的服務

  • 在介面上加入如下註解:@BindingType(SOAPBinding.SOAP12HTTP_BINDING)
  • 再重新發布服務端。注意:每次我們重新發布服務端的時候,埠都會被佔用,需要我們手動結束任務,清理出埠來。

4.4、CXF攔截器

  • CXF攔截器的原理:
    • 攔截器可以攔截請求和響應
    • 攔截器可以有多個
    • 攔截器可以根據需要自定義
  • CXF攔截器的使用:
    • 攔截器必須加到服務端,在服務端釋出服務之前加入
    • 獲取攔截器列表,將自己的攔截器加入列表中
  • CXF攔截器的應用場景:
    • 一般用於測試,比如:安全性方面:過濾非法請求、非法程式碼等
    • 但是一般情況下是不會用的,因為攔截器加上了之後會增加正式伺服器的負載,影響效能,而且這些攔截器和業務邏輯是無關的
    • 一般情況下,攔截器會加到代理伺服器上面,以後用或不用,是由經理來決定的

示例程式碼如下:

package com.itheima.webservice.cxf.server;import org.apache.cxf.interceptor.LoggingInInterceptor;import org.apache.cxf.interceptor.LoggingOutInterceptor;import org.apache.cxf.jaxws.JaxWsServerFactoryBean;/* * 釋出服務端 */public class WeatherServer {    public static void main(String[] args) {        /* JaxWsServerFactoryBean釋出服務,需要設定3個引數:1.服務介面; 2.服務實現類;  3.服務地址;           Endpoint僅支援釋出實現類,JaxWsServerFactoryBean支援釋出介面        */        // JaxWsServerFactoryBean釋出服務        JaxWsServerFactoryBean jaxWsServerFactoryBean = new JaxWsServerFactoryBean();        // 設定服務介面        jaxWsServerFactoryBean.setServiceClass(WeatherInterface.class);        // 設定服務地址        jaxWsServerFactoryBean.setAddress("http://127.0.0.1:12345/weather");        // 設定服務實現類        jaxWsServerFactoryBean.setServiceBean(new WeatherInterfaceImpl());        // 加入CXF攔截器        jaxWsServerFactoryBean.getInInterceptors().add(new LoggingInInterceptor());        jaxWsServerFactoryBean.getOutInterceptors().add(new LoggingOutInterceptor());        // 釋出服務        jaxWsServerFactoryBean.create();    }}

重新發布服務端和客戶端,服務端控制檯打印出的結果如下:

----------------------------ID: 1Address: http://127.0.0.1:12345/weatherEncoding: UTF-8Http-Method: POSTContent-Type: text/xml; charset=UTF-8Headers: {Accept=[*/*], Cache-Control=[no-cache], connection=[keep-alive], Content-Length=[240], content-type=[text/xml; charset=UTF-8], Host=[127.0.0.1:12345], Pragma=[no-cache], SOAPAction=[""], User-Agent=[Apache-CXF/3.2.6]}Payload:<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">    <soap:Body><ns2:queryWeather xmlns:ns2="http://server.cxf.webservice.itheima.com/">        <arg0>山西省運城市永濟市</arg0></ns2:queryWeather>    </soap:Body></soap:Envelope>--------------------------------------from client...山西省運城市永濟市九月 22, 2018 12:18:05 上午 org.apache.cxf.services.WeatherInterfaceService.WeatherInterfacePort.WeatherInterface資訊: Outbound Message---------------------------ID: 1Response-Code: 200Encoding: UTF-8Content-Type: text/xmlHeaders: {}Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">    <soap:Body><ns2:queryWeatherResponse xmlns:ns2="http://server.cxf.webservice.itheima.com/">        <return>暖且晴</return></ns2:queryWeatherResponse>    </soap:Body></soap:Envelope>--------------------------------------

4.5、實現-客戶端

  • 第一步:生成客戶端程式碼
  • wsdl2java命令是CXF提供的生成客戶端的工具,它和wsimport類似,可以根據WSDL生成客戶端程式碼。wsdl2java -p com.itheima.cxf.weather -d . http://127.0.0.1:12345/weather?wsdl演示效果如下圖所示:
  • wsdl2java常用引數:
    • -d,指定客戶端程式碼輸出目錄
    • -p,指定客戶端程式碼輸出包名,如果不指定該引數,預設包名是WSDL的名稱空間的倒序
  • wsdl2java支援SOAP1.1和SOAP1.2協議的客戶端生成。
  • 第二步:使用說明書,使用生成的客戶端程式碼呼叫服務端
    • 先引入jar包
    • 相關推薦

      day46_Webservice學習筆記_02

      一、回顧昨天所學 什麼是webservice?    什麼是遠端呼叫技術?答:系統和系統之間的呼叫,從遠端系統當中獲取業務資料。    Webservice是web服務,他是用http傳輸SOAP協議資料的一種遠端呼叫技術。Webservice的入門程式    服務端        第一步:建立SEI介

      Hibernate學習筆記_02

      提交 dao層 .get cti log www 並且 open cglib 上篇文章(傳送門:Hibernate學習筆記_01)介紹了Hibernate是什麽,如何搭建,配置文件詳解以及Hibernate的一些基本API詳解這幾個方面做了簡單介紹,那麽本文將會從一下5

      Flask_學習筆記_02: URL和檢視

      今天來學習Flask中URL和檢視的相關知識。 URL不多說了,訪問網站,瀏覽器中的地址大家都可以看到,比如我的51CTO的blog網址是:http://blog.51cto.com/jiaszwx 如果你在位址列裡敲:http://blog.51cto.com/ 那麼瀏覽器返回的是51CTO部落格的主頁

      Flask_學習筆記_02: URL和視圖

      通過 輸入 從數據 -o easy 技術分享 welcome 參數 直接 今天來學習Flask中URL和視圖的相關知識。 URL不多說了,訪問網站,瀏覽器中的地址大家都可以看到,比如我的51CTO的blog網址是:http://blog.51cto.com/jiaszwx

      Flask_學習筆記_02: 頁面跳轉

      頁面跳轉是網頁開發中需要實現的最基本的一個功能,使用者點選頁面中的一個超連結或者按鈕,就會跳轉到一個新頁面。那麼在Flask當中是如何實現的呢? 在下面的例子中,也會用到url_for(),還有另外一個redirect。目前幾乎所有的網站都需要使用者登入,才能釋出新內容或者做相關的更改。下面就以使用者要釋出

      SpringMVC學習筆記_02

      1、springmvc對多檢視的支援 (1)匯入xml格式檢視支援的jar包   注意:springmvc本身就支援xml格式,所以不用匯入其他支援的jar包了。 (2)在springmvc.xml中配置支援多檢視     <!-- 配置支援

      day43_Oracle學習筆記_02

      八、子查詢 示例程式碼如下:子查詢.txt SQL> --rownum 行號SQL> select rownum,empno,ename,sal from emp;    ROWNUM      EMPNO ENAME             SAL                    

      day62_Mybatis學習筆記_02

      今天內容安排: 1、高階結果對映(一對一、一對多、多對多)(重點) 2、延遲載入 3、查詢快取 4、Spring 和 mybatis 的整合(重點) 5、逆向工程 1、高階結果對映(即:關聯查詢對映)(重點) 1.1、分析資料模型 1.1.1、思路 1、每張表記錄

      day64_SpringMVC學習筆記_02

      1、springmvc對多檢視的支援 (1)匯入xml格式檢視支援的jar包   注意:springmvc本身就支援xml格式,所以不用匯入其他支援的jar包了。 (2)在springmvc.xml中配置支援多檢視     <!-- 配置支援多檢視 -->    <bean 

      OpenGL_Qt學習筆記_02(繪製簡單平面幾何圖形)

      #include "glwidget.h" #include "ui_glwidget.h" #include <QtGui> #include <QtCore> #include <QtOpenGL> #ifndef GL_MULTISAMPLE #define

      Robot Operating System (ROS)學習筆記4---語音控制

      sla 語音 出現 tput http 學習 process 輸入 ubun 搭建環境:XMWare Ubuntu14.04 ROS(indigo) 轉載自古月居 轉載連接:http://www.guyuehome.com/260 一、語音識別包 1、安裝

      MySQL學習筆記(六)—— MySQL自連接

      概念 cor 子查詢 ron 表操作 例子 質量 _id order by 有的時候我們需要對同一表中的數據進行多次檢索,這個時候我們可以使用之前學習過的子查詢,先查詢出需要的數據,再進行一次檢索。 例如:一張products表,有產品id,供應商id(vend_

      jquery 深入學習筆記之中的一個 (事件綁定)

      color 動態 name his pan mouseover this pre con 【jquery 事件綁定】 1、加入元素事件綁定 (1) 加入事件為當前元素 $(‘p‘).on(‘click‘,function(){ //code here ..

      AngularJS入門學習筆記

      rect directive 技術分享 attr 兩個 ava 內容 module 大括號 首先聲明: 本博客源自於學習:跟我學AngularJs:AngularJs入門及第一個實例。通過學習,我自己的一些學習筆記。 1.AngularJS的一些基本特性 (1)使用雙大括號

      Python學習筆記-2017.5.4

      列表 lin 覆蓋範圍 復習 處理 pytho 內部 global txt 本文章記錄學習過程中的細節和心得: 復習所學課程: 1、文件的操作:   打開文件,對文件的操作打開方式有兩種:   第一種:      f = open("test.txt", "r")#以只讀

      SAS學習筆記之函數應用

      不能 oracle 理解 資料 oracl 函數應用 特殊 put acl 今天在做數據需求的時候遇到一些問題,因為不能夠在數據庫裏面做,僅僅好在SAS裏面實現。這就遇到了一些麻煩,須要使用一些函數實現部分功能,如查找字段中某個特殊字符出現的次數,查找某個字符的位置等,

      OpenCV2學習筆記(十五):利用Cmake高速查找OpenCV函數源代碼

      one 生成 img log 分享 lan 學習筆記 全部 modules 在使用OpenCV時,在對一個函數的調用不是非常了解的情況下,通常希望查到該函數的官方聲明。而假設想進一步研究OpenCV的函數,則必須深入到源碼。在VS中我們能夠選中想要查

      avalonjs 學習筆記1---checkbox

      nod item ack lex server ini npm 學習 define 一、vscode 安裝使用 1.vs code+node.js下載安裝 2.在node.js command prompt 中運行 npm install -g live-server 3

      Linux學習筆記(三):系統執行級與執行級的切換

      查看 用戶操作 回車 water hat ntsysv tde 文件表 config 1.Linux系統與其它的操作系統不同,它設有執行級別。該執行級指定操作系統所處的狀態。Linux系統在不論什麽時候都執行於某個執行級上,且在不同的執行級上執行的程序和服務都不同,所要

      Principle of Computing (Python)學習筆記(7) DFS Search + Tic Tac Toe use MiniMax Stratedy

      ide out generate depth sku color ati cond with 1. Trees Tree is a recursive structure. 1.1 math nodes https://class.coursera.org/prin