WebServicephp
幾個重要知識:java
1. namespaceweb 至關於schema文件的id面試 2. targetNamespace屬性ajax 用來指定schema文件的namespace的值spring 3. xmlns屬性數據庫 引入一個約束, 它的值是一個schema文件的namespace值apache 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. 請求的組成: 請求頭 請求體: 只有post請求有 2. 響應的組成 響應頭 響應體 : 瀏覽器解析顯示的數據 3. 請求的過程 |
|
各個門戶網站顯示的股票行情信息數據又是怎麼來的呢?
面試問題:
? : xml
? : schema
webservice定義語言, 對應.wsdl文檔, 一個webservice會對應一個惟一的wsdl文檔, 定義了客戶端與服務端發送請求和響應的數據格式和過程
定義SEI @webservice @webMethod
定義SEI的實現
發佈: Endpoint.publish(url, SEIImplObject)
1. 基於Web的服務:服務器端整出一些資源讓客戶端應用訪問(獲取數據) 2. 一個跨語言、跨平臺的規範(抽象) 3. 多個跨平臺、跨語言的應用間通訊整合的方案(實際)
以各個網站顯示天氣預報功能爲例: 氣象中心的管理系統將收集的天氣信息並將數據暴露出來(經過WebService Server), 而各大站點的應用就去調用它們獲得天氣信息並以不一樣的樣式去展現(WebService Client). 網站提供了天氣預報的服務,但其實它們什麼也沒有作,只是簡單了調用了一下氣象中心服務器上的一段代碼而已。 |
Dao |
Service |
Servlet |
JSP |
.net應用 |
php應用 |
移動客戶端應用 |
webService Server |
webService Client |
webService Client |
webService Client |
http協議 |
Java |
瀏覽器 |
web service能解決:
跨平臺調用
跨語言調用
遠程調用
1. 同一家公司的新舊應用之間 2. 不一樣公司的應用之間 分析業務需求:天貓網與中通物流系統如何交互? 3. 一些提供數據的內容聚合應用:天氣預報、股票行情 |
天貓網應用(Java) |
中通物流管理應用(.net) |
顯示物流信息的程序 |
訪問物流數據表數據的程序 |
寫一段代碼調用上面的程序返回物流數據
WebService Server |
寫一段代碼調用WebService Server暴露的接口, 獲得物流數據
WebService Client |
HTTP + XML |
SOAP |
HTTP |
直譯 : WebService定義語言
1. 對應一種類型的文件.wsdl 2. 定義了web service的服務器端與客戶端應用交互傳遞請求和響應數據的格式和方式 3. 一個web service對應一個惟一的wsdl文檔 |
直譯: 簡單對象訪問協議
|
直譯: web service的終端接口,
1. 就是WebService服務器端用來處理請求的接口 |
一個apache的用於開發webservice服務器端和客戶端的框架 |
– 使用JDK開發(1.6及以上版本)
– 使用CXF框架開發(工做中)
– 服務器端
– 客戶端
– @WebService( SEI和SEI的實現類)
– @WebMethod(SEI中的全部方法)
– Endpoint(終端, 發佈webservice)
– 查看對應的wsdl文檔:…..?wsdl (通常瀏覽器)
– 請求webService並查看請求和響應消息(webservice瀏覽器)
– 藉助jdk的wsimort.exe工具生成客戶端代碼:
wsimport -keep url //url爲wsdl文件的路徑
– 藉助生成的代碼編寫請求代碼
– http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx
– 藉助命令工具自動生成客戶端代碼
– 藉助生成的代碼編寫請求代碼
說明: 直接生成客戶端代碼會拋異常, 沒法生成客戶端代碼, 解決辦法:
將 <s:element ref="s:schema" /><s:any /> 替換成 <s:any minOccurs="2" maxOccurs="2"/> 備註: 這個是Java調用net的webservice都有的問題 |
加入cxf的jar包便可,其它不須要改動
<definitions>
<type>
<message>
<portType>
<binding>
<service>
<definitions> <types> <schema> <element> </types> <message> <part> </message> <portType> <operation> <input> <output> </portType> <binding> <operation> <input> <output> </binding> <service> <port> <address> </service> </definitions> |
types |
message |
portType |
binding |
service |
schema |
element |
part |
operation |
input/output |
operation |
input/output |
port |
address |
SEI |
SEI實現類 |
name屬性 |
客戶端生成的Service的實現類(工廠) |
– int,float,boolean等
– String
– 集合:數組,List, Set, Map
– 自定義類型 Student
一次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 |
Client |
server |
Interceptor(攔截器接口)
AbstractPhaseInterceptor(自定義攔截器今後繼承)
LoggingInInterceptor(系統日誌入攔截器類)
LoggingOutInterceptor(系統日誌出攔截器類)
– LoggingInInterceptor
– LoggingOutInterceptor
– 服務器端的in攔截器
– 客戶端的out攔截器
– xfzhang/123456
– 建立spring的配置文件beans.xml,在其中配置SEI
– 在web.xml中,配置上CXF的一些核心組件
– 生成客戶端代碼
– 建立客戶端的spring配置文件beans-client.xml,並配置
– 編寫測試類請求web service
– 在beans.xml中,在endpoint中配置上入攔截器
– 經過Client對象設置出攔截器
跨域請求問題:
1. 什麼是跨域請求? Host 1. sina.com--=->baidu.com/xxx.jsp 2. localhost----à192.168.42.165 2. 解決ajax跨域請求webservice的問題? 在客戶端應用中使用java編碼去請求webservice, 在頁面中去請求本身的後臺 |
l 做用在具體類上。而不是接口。 l 一個類只有添加了此註解才能夠經過Endpoint發佈爲一個web服務。 l 一個添加了此註解的類,必需要至少包含一個實例方法。靜態方法和final方法不能被髮布爲服務方法。 l WebService註解包含如下參數:
|
l 此註解用在方法上,用於修改對外暴露的方法。
|
用於定製返回值到WSDL的映射
|
用於定義WSDL中的參數映射
|
用於定義實體類的屬性到WSDL中的映射(get/set方法上)
|
即便是沒有修改源代碼,只修改了註解,客戶端的代碼也必需要從新生成, 不然調用將會失敗。 |
*注:出之尚硅谷—張曉飛