WebService的講解 和 CXF 的初步使用

1. 複習準備

1.1. Schema約束

幾個重要知識:java

  1. namespace

      至關於schema文件的idweb

  1. targetNamespace屬性

      用來指定schema文件的namespace的值 面試

  1. xmlns屬性

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

  1. schemaLocation屬性

      用來指定引入的schema文件的位置瀏覽器

 

schema規範中:服務器

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

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

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

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

    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. 
 面試問題 

 

  1.webservice至關於HTTP+?+?

    ? : xml

    ? : schema

  2.wsdl是什麼?

    webservice定義語言, 對應.wsdl文檔, 一個webservice會對應一個惟一的wsdl文檔,

    定義了客戶端與服務端發送請求和響應的數據格式和過程

  3.如何發佈一個webservice?

    定義SEI   @webservice @webMethod

    定義SEI的實現

    發佈:  Endpoint.publish(url, SEIImplObject)

 

  4.  如何請求一個webservice?

    1.根據wsdl文檔生成客戶端代碼  jdk/cxf

    2.根據生成的代碼調用webService

 

3. 關於Web Service的幾個問題

3.1. Web service是什麼?

 

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

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

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

 

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

    氣象中心的管理系統將收集的天氣信息並將數據暴露出來(經過WebService Server), 

    而各大站點的應用就去調用它們獲得天氣信息並以不一樣的樣式去展現(WebService Client).

    網站提供了天氣預報的服務,但其實它們什麼也沒有作,

    只是簡單了調用了一下氣象中心服務器上的一段代碼而已

  

3.2. 爲何要用Web service

  web service能解決:

    跨平臺調用

    跨語言調用

    遠程調用

 

 

3.3. 何時使用web Service?

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

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

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

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

  

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

4.1. WSDLweb service definition language

  直譯 : WebService定義語言

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

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

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



4.2. SOAPsimple object  access protocal

  直譯: 簡單對象訪問協議

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

    http+xml片段


4.3. 
SEIWebService EndPoint Interface(終端) 

直譯: web service的終端接口,

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

  @Webservice

  @WebMethod


4.4. 
CXFCeltix + XFire 

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

 

5. 開發webservice

5.1. 概述  

  • 開發手段:

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

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

  • 組成:

    – 服務器端

    – 客戶端

 

5.1. 使用JDK開發WebService

1).開發服務器端

  • Web Service編碼:

    – @WebService( SEISEI的實現類)

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

 1 import javax.jws.WebMethod;
 2 import javax.jws.WebService;
 3 
 4 /**
 5  * SEI
 6  * @author Administrator
 7  *
 8  */
 9 @WebService
10 public interface HelloWs {
11 
12     @WebMethod
13     public String sayHello(String name);
14 }
Interface
 1 import javax.jws.WebService;
 2 
 3 import com.ittest.ws.service.HelloWs;
 4 /**
 5  * SEI  的實現
 6  * @author Administrator
 7  *
 8  */
 9 @WebService
10 public class HelloWsImpl implements HelloWs {
11 
12     public String sayHello(String name) {
13         System.out.println("service sayHello()  "+name);
14         return "Hello "+name;
15     }
16 
17 }
Implement
  • 發佈Web Service

    – Endpoint(終端, 發佈webservice)

 1 import javax.xml.ws.Endpoint;
 2 
 3 import com.ittest.ws.service.impl.HelloWsImpl;
 4 
 5 /**
 6  * 發佈webservice
 7  * @author Administrator
 8  *
 9  */
10 public class TestService {
11 
12     public static void main(String[] args) {
13         String address = "http://192.168.1.100:8989/webService_01_sayService/hellows";
14         Endpoint.publish(address, new HelloWsImpl());
15         System.out.println("發佈 webService_01_sayService 成功");
16     }
17 }
EndPoint

2). 開發客戶端

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

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

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

 

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

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

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

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

 

 

 

5.2. 監聽請求: 使用EclipseTCP/IP工具(端口轉發)

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

 

 

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

 

 

5.3. 調用免費的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.4. 使用CXF開發web service

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

  Client: 加入cxf的jar包便可,使用cxf wsdl2java 命令生成代碼(加入path)

    D:\javaeclipsWorkSpace\javaeeProject\webService_01_cxf_client3\src>wsdl2java       D:\javaeclipsWorkSpace\javaeeProject\webService_01_cxf_client3\hellows.wsdl

   

  wsdl2java 異常說明:

 

    G:\myeclipseworkspace\WS-client\src>wsdl2java http://192.168.1.4/server?wsdl

    Exception in thread "main" java.lang.AssertionError: org.xml.sax.SAXParseExcepti

    on; systemId: jar:file:/F:/apache-cxf-3.0.0/lib/jaxb-xjc-2.2.7.jar!/com/sun/tool

    s/xjc/reader/xmlschema/bindinfo/binding.xsd; lineNumber: 52; columnNumber: 88; s

    chema_reference: 因爲 accessExternalSchema 屬性設置的限制而不容許 'file' 訪問,

    所以沒法讀取方案文檔 'xjc.xsd'

  緣由:  Cxf jdk的版本不匹配 .

    微博文章:   http://blog.csdn.net/yajun0628/article/details/74458351

相關文章
相關標籤/搜索