WebService

WebServicephp

 

1. 複習準備

1.1. Schema約束

幾個重要知識:java

1. namespaceweb

至關於schema文件的id面試

2. targetNamespace屬性ajax

用來指定schema文件的namespace的值spring

3. xmlns屬性數據庫

引入一個約束, 它的值是一個schema文件的namespaceapache

4. schemaLocation屬性跨域

用來指定引入的schema文件的位置數組

 

schema規範中:

   1. 全部標籤和屬性都須要有schema文件來定義

   2. 全部的schema文件都須要有一個id, 但在這裏它叫namespace,

   3. namespace的值由什麼來指定?

      由targetNamespace屬性來指定, 它的值是一個url(頗有可能不存在)

   4. 如何引入一個Schema約束?

      屬性? : 用xmlns屬性

      屬性值: 對應的schema文件的id(namespace值)

   5. 若是引入的schema不是w3c組織定義, 必須指定schema文件的位置

   6. schema文件的位置由什麼屬性來指定?

      屬性? : schemaLocation

      屬性值: namespace path

7. 若是引入了N個約束, 須要給n-1個取別名

  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1.2. HTTP協議

幾個重要知識:

1. 請求的組成:
   
請求行(請求方式  path  http1.1)

請求頭

請求體: 只有post請求有

2. 響應的組成
   
響應狀態行:

響應頭

響應體 : 瀏覽器解析顯示的數據

3. 請求的過程
   

 

 

2.  提出2個問題

問題一:

 

 

 

  1. 它們公司服務器的數據庫中都保存了天氣預報數據嗎?
  2. 若是沒有, 那數據都存在哪了呢?
  3. 這些網站是如何獲得這些數據的呢?

問題二:

 

 

各個門戶網站顯示的股票行情信息數據又是怎麼來的呢?

 

面試問題:

  1. 1.     webservice至關於HTTP+?+?

? : xml

? : schema

  1. 2.     wsdl是什麼?

webservice定義語言, 對應.wsdl文檔, 一個webservice會對應一個惟一的wsdl文檔, 定義了客戶端與服務端發送請求和響應的數據格式和過程

  1. 3.     如何發佈一個webservice?

定義SEI   @webservice @webMethod

定義SEI的實現

發佈:  Endpoint.publish(url, SEIImplObject)

  1. 4.     如何請求一個webservice?
    1. 1.     根據wsdl文檔生成客戶端代碼  jdk/cxf
    2. 2.     根據生成的代碼調用webService

 

 

 

 

 

 

 

 

 

 

 

3. 關於Web Service的幾個問題

3.1. Web service是什麼?

1. 基於Web的服務:服務器端整出一些資源讓客戶端應用訪問(獲取數據)

2. 一個跨語言、跨平臺的規範(抽象)

3. 多個跨平臺、跨語言的應用間通訊整合的方案(實際)

 

以各個網站顯示天氣預報功能爲例:

氣象中心的管理系統將收集的天氣信息並將數據暴露出來(經過WebService Server), 而各大站點的應用就去調用它們獲得天氣信息並以不一樣的樣式去展現(WebService Client).

網站提供了天氣預報的服務,但其實它們什麼也沒有作,只是簡單了調用了一下氣象中心服務器上的一段代碼而已

 

Dao

         Service

Servlet

JSP

.net應用

php應用

移動客戶端應用

webService

Server

webService

Client

webService

Client

webService

Client

http協議

Java

瀏覽器

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3.2.       爲何要用Web service?

web service能解決:

               跨平臺調用

           跨語言調用

           遠程調用

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3.3. 何時使用web Service?

1. 同一家公司的新舊應用之間

2. 不一樣公司的應用之間

分析業務需求:天貓網與中通物流系統如何交互?

3. 一些提供數據的內容聚合應用:天氣預報、股票行情

 

 

 

天貓網應用(Java)

中通物流管理應用(.net)

顯示物流信息的程序

訪問物流數據表數據的程序

寫一段代碼調用上面的程序返回物流數據

 

         WebService Server

寫一段代碼調用WebService Server暴露的接口, 獲得物流數據

 

         WebService Client

HTTP + XML

SOAP

HTTP

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4. Web Service中的幾個重要術語

4.1. WSDL:web service definition language

直譯 : WebService定義語言

 

1. 對應一種類型的文件.wsdl

2. 定義了web service的服務器端與客戶端應用交互傳遞請求和響應數據的格式和方式

3. 一個web service對應一個惟一的wsdl文檔

4.2.       SOAP:simple object  access protocal

直譯: 簡單對象訪問協議

 

  1. 是一種簡單的、基於HTTPXML的協議, 用於在WEB上交換結構化的數據
  2. soap消息:請求消息響應消息
  3. 3.      http+xml片段

 

4.3.       SEI:WebService EndPoint Interface(終端)

直譯: web service的終端接口,

 

1. 就是WebService服務器端用來處理請求的接口

 

4.4.       CXF:Celtix + XFire

一個apache的用於開發webservice服務器端和客戶端的框架

 

 

 

 

 

5.      開發webservice

5.1. 概述

  • 開發手段:

–     使用JDK開發(1.6及以上版本)

–     使用CXF框架開發(工做中)

  • 組成:

–     服務器端

–     客戶端

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

5.2.       使用JDK開發WebService

1).開發服務器端

  • Web Service編碼:

–     @WebService( SEI和SEI的實現類)

–     @WebMethod(SEI中的全部方法)

  • 發佈Web Service

–     Endpoint(終端, 發佈webservice)

 

 

 

 

2). 開發客戶端

  • 使用eclipse提供的web service瀏覽器訪問

–     查看對應的wsdl文檔:…..?wsdl (通常瀏覽器)

–     請求webService並查看請求和響應消息(webservice瀏覽器)

 

  • 建立客戶端應用編碼方式訪問

–     藉助jdk的wsimort.exe工具生成客戶端代碼:

wsimport -keep url   //url爲wsdl文件的路徑

–     藉助生成的代碼編寫請求代碼

 

 

 

 

 

 

 

 

 

 

 

5.3.       監聽請求: 使用Eclipse的TCP/IP工具(端口轉發)

  1. 將服務器端的WSDL文檔保存到客戶端本地
  2. 修改文檔: 將端口號從8989改成8080
  3. 根據本地的wsdl文檔生成客戶端代碼, 並編寫客戶端的調用代碼
  4. 配置eclipse的TCP/IP,啓動監聽

 

  1. 執行客戶端代碼發送WebService請求

 

 

 

 

 

 

 

 

 

5.4.       調用免費的web service(天氣預報)

  1. Google」免費WebService」, 找到提供天氣預報Webservice的網絡地址

–      http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx

 

  1. 使用eclipseweb service瀏覽器訪問

 

  1. 客戶端編碼方式訪問

–     藉助命令工具自動生成客戶端代碼

–     藉助生成的代碼編寫請求代碼

 

說明: 直接生成客戶端代碼會拋異常, 沒法生成客戶端代碼, 解決辦法:

  1. 將對應的wsdl文檔保存到本地
  2. 修改wsdl文檔的部份內容:

 <s:element ref="s:schema" /><s:any /> 替換成 <s:any minOccurs="2" maxOccurs="2"/>

備註: 這個是Java調用net的webservice都有的問題

 

 

 

 

5.5.       使用CXF開發web service

加入cxf的jar包便可,其它不須要改動

5.6.       WebService請求深刻分析

1). 分析WebService的WSDL文檔結構

1.1). 實例截圖

 

<definitions>

         <type>

         <message>

         <portType>

         <binding>

         <service>

 

 

 

 

 

 

 

 

1.2). 文檔結構

<definitions>

              <types>

                     <schema>

                            <element>

              </types>

              <message>

                     <part>

</message>

              <portType>

                     <operation>

                            <input>

                            <output>

</portType>

              <binding>

                     <operation>

                            <input>

                            <output>

</binding>

              <service>

                     <port>

                            <address>

</service>

</definitions>

 

 

 

 

 

 

1.3). 文檔結構圖

 

         types

message

portType

binding

service

         schema

         element

part

operation

input/output

operation

input/output

port

address

SEI

SEI實現類

name屬性

客戶端生成的Service的實現類(工廠)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1.4). 重要標籤的說明

  • types - 數據類型(標籤)定義的容器,裏面使用schema定義了一些標籤結構供message引用
  • message - 通訊消息的數據結構的抽象類型化定義。引用types中定義的標籤
  • operation - 對服務中所支持的操做的抽象描述,一個operation描述了一個訪問入口的請求消息與響應消息對。
  • portType - 對於某個訪問入口點類型所支持的操做的抽象集合,這些操做能夠由一個或多個服務訪問點來支持。
  • binding - 特定端口類型的具體協議和數據格式規範的綁定。
  • service- 相關服務訪問點的集合
  • port - 定義爲協議/數據格式綁定與具體Web訪問地址組合的單個服務訪問點。

 

 

 

 

 

 

 

 

 

2). 測試CXF支持的數據類型

  1. 基本類型

–     int,float,boolean

  1. 引用類型

–     String

–     集合:數組,List, Set, Map

–     自定義類型   Student

 

 

 

 

3). 一次Web service請求的流程

一次web service請求的本質:

1)客戶端向服務器端發送了一個soap消息(http請求+xml片段)

2) 服務器端處理完請求後, 向客戶端返回一個soap消息

 

wsdl

wsdl

<q0:sayHello>          <arg0>BB</arg0>

</q0:sayHello>

那麼它的流程是怎樣的呢?

 

String result = hellWS.sayHello("BOB");

class HelloWsImpl {

                   String sayHello(String anme) {}

}

http+xml

<ns2:sayHelloResponse">

         <return>Hello BB</return>

</ns2:sayHelloResponse>

wsdl

wsdl

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

5.7.       CXF框架的深刻使用

1).CXF的攔截器

1.1) 理解

  • 爲何設計攔截器?
  1. 爲了在webservice請求過程當中,能動態操做請求和響應數據, CXF設計了攔截器.
  • 攔截器分類:
  1. 按所處的位置分:服務器端攔截器,客戶端攔截器
  2. 按消息的方向分:入攔截器,出攔截器
  3. 按定義者分:系統攔截器,自定義攔截器

 

 

Client

server

 

 

 

 

 

 

 

  • 攔截器API

Interceptor(攔截器接口)

AbstractPhaseInterceptor(自定義攔截器今後繼承)

LoggingInInterceptor(系統日誌入攔截器類)

LoggingOutInterceptor(系統日誌出攔截器類)

 

 

 

1.2) 編碼實現攔截器

  • 使用日誌攔截器,實現日誌記錄

–     LoggingInInterceptor

–     LoggingOutInterceptor

  • 使用自定義攔截器,實現用戶名與密碼的檢驗

–     服務器端的in攔截器

–     客戶端的out攔截器

–     xfzhang/123456

 

 

 

 

 

 

 

 

 

 

 

2). 用CXF編寫基於spring的web service

2.1). 編碼實現

  1. 1.     Server

–     建立spring的配置文件beans.xml,在其中配置SEI

–     在web.xml中,配置上CXF的一些核心組件

  1. 2.     Client

–     生成客戶端代碼

–     建立客戶端的spring配置文件beans-client.xml,並配置

–     編寫測試類請求web service

 

2.2). 添加自定義攔截器

  1. 1.     Server

–     在beans.xml中,在endpoint中配置上入攔截器

  1. 2.     Client

–     經過Client對象設置出攔截器

 

 

 

 

 

 

 

 

 

 

 

 

 

 

5.8.       其它調用WebService的方式

1). Ajax調用webService

 

跨域請求問題:

1. 什麼是跨域請求?   Host

1. sina.com--=->baidu.com/xxx.jsp

2. localhost----à192.168.42.165

2. 解決ajax跨域請求webservice的問題?

在客戶端應用中使用java編碼去請求webservice, 在頁面中去請求本身的後臺

 

2). Jquery調用WebService

 

 

 

3). HttpURLConnection調用WebService

 

 

 

5.9.       經過註解修改wsdl文檔

1). JDK中的相關注解

1.1).  @WebService

l  做用在具體類上。而不是接口。

l  一個類只有添加了此註解才能夠經過Endpoint發佈爲一個web服務。

l  一個添加了此註解的類,必需要至少包含一個實例方法。靜態方法和final方法不能被髮布爲服務方法。

l  WebService註解包含如下參數:

 

 

 

 

 

 

 

 

 

 

 

1.2).  @WebMethod

l  此註解用在方法上,用於修改對外暴露的方法。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1.3).  @WebResult

用於定製返回值到WSDL的映射

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1.4).  @WebParam

用於定義WSDL中的參數映射

 

 

 

 

 

 

 

 

 

 

 

 

 

1.5).  @XmlElement

用於定義實體類的屬性到WSDL中的映射(get/set方法上)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2). 說明

即便是沒有修改源代碼,只修改了註解,客戶端的代碼也必需要從新生成, 不然調用將會失敗。

 

 

 

 

 

 

 

 

 

 

 

 *注:出之尚硅谷—張曉飛

相關文章
相關標籤/搜索