1. 程式人生 > >webService為其它程式提供介面示例,建立wsdl檔案

webService為其它程式提供介面示例,建立wsdl檔案

Web Service實踐之——開始XFire

一、AxisXFire的比較

XFire是與Axis2 並列的新一代WebService平臺。之所以並稱為新一代,因為它:

1、支援一系列Web Service的新標準--JSR181WSDL2.0 JAXB2WS-Security等;

2、使用Stax解釋XML,效能有了質的提高。XFire採用Woodstox Stax實現;

3、容易上手,可以方便快速地從pojo釋出服務; 

4Spring的結合;

5、靈活的Binding機制,包括預設的Acegis,xmlbeans,jaxb2,castor

XFireAxis1效能的比較

1XFireAxis1.32-6

2XFire的響應時間是Axis1.31/21/5

XFireAxis2的比較

雖然XFireAxis2都是新一代的WebService平臺,但是Axis2的開發者太急於推出1.0版本,所以1.0還不是一個穩定的版本,它的開發者宣稱1.1版本即將推出,希望1.1版本會是個穩定的版本。在XFire捐獻給apache後有人認為Axis2將會滅亡。其實在很多人眼裡,Axis2並不是pojo形式,現在也好象XFireAxis更有市場,也有很多人開始從Axis轉向XFire

據說,XFire確實比Axis2簡單很多 

AXIS VS CXF

SOA

領域,我們認為Web ServiceSOA體系的構建單元(building block)。對於作過WebService的開發人員來說,AXISCXF一定都不會陌生。這兩個產品都是Apache孵化器下面的Web Service開源開發工具。 Axis2的最新版本是1.3CXF現在已經到了2.0版本。

這兩個框架 都是從已有的開源專案發展起來的。Axis2是從Axis1.x系列發展而來。CXF則是XFireCeltix專案的結合產品。Axis2是從底層全部重新實現,使用了新的擴充套件性更好模組架構。 CXF也重新的深化了XFireCeltix這兩個開發工具。

新產品的退出導致了幾個問題。是不是現有的使用Axis 1.x

XFireCelix的應用需要遷移的新的版本上。如果一個開發人員確定要遷移它的應用到新的框架上,那麼他應該選擇哪一個呢?相反的,如果一個開發者決定從頭開發一個新的Web Service,他應該使用哪個呢? 這兩個框架哪一個更好一些呢?

對於系統遷移來說,也許遷移到新的框架並不難。AxisCXF都提供了遷移的指導。能夠給開發者一些遷移的技巧和經驗。但是對於這樣遷移,這兩個開源專案都沒有提供遷移的工具。對於這樣的遷移工作,儘管很值得去尋找所有的可行方案。Axis2CXF都有各自不同的WebService開發方法,每個方法都有相當數量擁護者。

通過一個比較矩陣來比較Axis2CXF變得有現實的意義。這兩個專案都開發不夠成熟,但是最主要的區別在以下幾個方面:

1. CXF支援 WS-AddressingWS-Policy, WS-RM, WS-SecurityWS-I Basic ProfileAxis2不支援WS-Policy,但是承諾在下面的版本支援。

2. CXF可以很好支援SpringAxis2不能

3. AXIS2支援更廣泛的資料並對,如XMLBeansJiBXJaxMeJaxBRI和它自定義的資料繫結ADB。注意JaxMEJaxBRI都還是試驗性的。CXF只支援JAXBAegis。在CXF2.1

4. Axis2支援多語言-除了Java,他還支援C/C++版本。

比較這兩個框架的Web Service開發方法與比較它們的特性同樣重要。 從開發者的角度,兩個框架的特性相當的不同。 Axis2的開發方式類似一個小型的應用伺服器,Axis2的開發包要以WAR的形式部署到Servlet容器中,比如Tomcat,通過這些容器可以對工作中的Web Service進行很好的監控和管理。Axis2 Web administrion模組可以讓我們動態的配置Axis2.一個新的服務可以上載,啟用,使之失效,修改web服務的引數。管理UI也可以管理一個或者多個處於執行狀態的服務。這種介面化管理方式的一個弊端是所有在執行時修改的引數沒有辦法儲存,因為在重啟動之後,你所做的修改就會全部失效。

Axis2允許自己作為獨立的應用來發布Web Service,並提供了大量的功能和一個很好的模型,這個模型可以通過它本身的架構(modular architecture)不斷新增新的功能。有些開發人員認為這種方式對於他們的需求太過於繁瑣。這些開發人員會更喜歡CXF

CXF更注重開發人員的工效(ergonomics)和嵌入能力(embeddability)。大多數配置都可以API來完成,替代了比較繁瑣的XML配置檔案, Spring的整合性經常的被提及,CXF支援Spring2.0CXF's APISpring的配置檔案可以非常好的對應。CXF強調程式碼優先的設計方式(code-first design),使用了簡單的API使得從現有的應用開發服務變得方便。

不過你選擇Axis2還是CXF,你都可以從開源社群得到大量的幫助。這兩個框架都有商業公司提供服務,WSO2提供AXIS2的支援,Iona提供CXF的支援。這兩公司都有很活躍的開發者社群。 Axis2出現的時間較早,CXF的追趕速度快。我的建議是:如果你需要多語言的支援,你應該選擇AXIS2。如果你需要把你的實現側重JAVA並希望和Spring整合,CXF就是更好的選擇,特別是把你的Web Service嵌入其他的程式中。如果你覺得這兩個框架的新特性對於你並沒有太大的用處,你會覺得Axis1也是不錯的選擇,你應該繼續使用它知道你有充分的理由去更換它。

二、開始XFire的示例程式碼編寫:

以下是對程式碼的解釋,可以把示例專案下載匯入MyEclipse中,匯入相應jar包直接執行。

1、配置XFire執行環境:

Tomcat下新建一個Web Applications,命名為stove,然後在其WEB-INF目錄下新建一個web.xml檔案,檔案中輸入:

Xml程式碼 

<?xml version="1.0" encoding="GB2312">

<!DOCTYPE web-app

    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"

    "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>

  <servlet>

    <servlet-name>XFireServlet</servlet-name>

    <display-name>XFire Servlet</display-name>

    <servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class>

  </servlet>

  <servlet-mapping>

    <servlet-name>XFireServlet</servlet-name>

    <url-pattern>/servlet/XFireServlet/*</url-pattern>

  </servlet-mapping>

  <servlet-mapping>

    <servlet-name>XFireServlet</servlet-name>

    <url-pattern>/services/*</url-pattern>

  </servlet-mapping>

</web-app>

其中主要就是引入了XFireServlet,用以處理Web Service請求,並且負責提供Web ServiceWSDL,如果你釋出了一個名為BookServiceWebService,則可以通過網址:

http://<伺服器>[:]/<webapp>/services/BookService

來訪問這個WebService,並且通過地址:

http://<伺服器>[:]/<webapp>/services/BookService?WSDL  來得到這個WebServiceWSDL資訊。

2、開發最簡單的WebService

WEB-INF目錄下新建src資料夾,然後再建一個package:

cn.com.pansky.webservice.xfire.study

,在這個包下面新建一個介面:

Java程式碼  

package cn.com.pansky.webservice.xfire.study;

public interface SayHiService{

  public String sayHi(String name);

}

這個介面是告訴伺服器你的WebService哪些方法可以被使用者呼叫的。下面我們再來寫一個SayHiService的實現類,以完成業務邏輯:

Java程式碼 

package cn.com.pansky.webservice.xfire.study;

public class SayHiServiceImpl implements SayHiService{

  public String sayHi(String name){

    if(name==null){

      return "連名字也不肯告訴我嗎?";

    }

    return name+", 你吃了嗎?沒吃回家吃去吧。";

  }

  public String 不告訴你(){

    return "我的名字不告訴你!";

  }

}

 這個類實現了sayHi方法,該方法是可以通過WebService呼叫訪問到的。另外還實現了一個方法“不告訴你”,該方法因為沒有在介面SayHiService中定義,所以不能被WebService呼叫到。

   這個例子足夠簡單吧,就跟我們剛學Java時寫的"Hello world"沒什麼兩樣。

到這裡為止,我們做的跟平時的Java開發沒啥區別,該如何來發布WebService呢?

3、把JAVA類釋出為WebService

WEB-INF/classes目錄下新建資料夾:META-INF/xfire,然後在該資料夾下新建一個XML檔案:services.xml,檔案內容如下:

Xml程式碼  

<beans xmlns="http://xfire.codehaus.org/config/1.0">

  <service>

    <name>SayHiService</name>

    <namespace>http://cn.com.pansky/SayHiService</namespace>

    <serviceClass>cn.com.pansky.webservice.xfire.study.SayHiService</serviceClass>

    <implementationClass>cn.com.pansky.webservice.xfire.study.SayHiServiceImpl</implementationClass>

  </service>

</beans>

 這個檔案定義一個WebService: SayHiService,並同時定義了介面和實現類。

好了,該建的檔案基本建完了,現在想辦法把src下的java檔案編譯成class,並複製到WEB-INF/classes目錄下

4、啟動Tomcat,測試WebService

如果Tomcat還沒配置好,抽兩分鐘再配一下。再把Tomcat啟動起來。

再開啟瀏覽器,輸入:

http://localhost/stove/services

,伺服器返回的結果如下:

Available Services:

    * SayHiService [wsdl]

     Generated by XFire ( http://xfire.codehaus.org/ ) 

我們看到我們的WebService已經佈署成功了,我們再看看它的WSDL資訊:

Xml程式碼 

<?xml version="1.0" encoding="UTF-8"?>

<wsdl:definitions targetNamespace="http://cn.com.pansky/SayHiService" xmlns:tns="http://cn.com.pansky/SayHiService" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenc11="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soapenc12="http://www.w3.org/2003/05/soap-encoding" xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">

  <wsdl:types>

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://cn.com.pansky/SayHiService">

<xsd:element name="sayHi">

<xsd:complexType>

<xsd:sequence>

<xsd:element maxOccurs="1" minOccurs="1" name="in0" nillable="true" type="xsd:string"/>

</xsd:sequence>

</xsd:complexType>

</xsd:element>

<xsd:element name="sayHiResponse">

<xsd:complexType>

<xsd:sequence>

<xsd:element maxOccurs="1" minOccurs="1" name="out" nillable="true" type="xsd:string"/>

</xsd:sequence>

</xsd:complexType>

</xsd:element>

</xsd:schema>

  </wsdl:types>

  <wsdl:message name="sayHiRequest">

    <wsdl:part name="parameters" element="tns:sayHi">

    </wsdl:part>

  </wsdl:message>

  <wsdl:message name="sayHiResponse">

    <wsdl:part name="parameters" element="tns:sayHiResponse">

    </wsdl:part>

  </wsdl:message>

  <wsdl:portType name="SayHiServicePortType">

    <wsdl:operation name="sayHi">

      <wsdl:input name="sayHiRequest" message="tns:sayHiRequest">

    </wsdl:input>

      <wsdl:output name="sayHiResponse" message="tns:sayHiResponse">

    </wsdl:output>

    </wsdl:operation>

  </wsdl:portType>

  <wsdl:binding name="SayHiServiceHttpBinding" type="tns:SayHiServicePortType">

    <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>

    <wsdl:operation name="sayHi">

      <wsdlsoap:operation soapAction=""/>

      <wsdl:input name="sayHiRequest">

        <wsdlsoap:body use="literal"/>

      </wsdl:input>

      <wsdl:output name="sayHiResponse">

        <wsdlsoap:body use="literal"/>

      </wsdl:output>

    </wsdl:operation>

  </wsdl:binding>

  <wsdl:service name="SayHiService">

    <wsdl:port name="SayHiServiceHttpPort" binding="tns:SayHiServiceHttpBinding">

      <wsdlsoap:address location="http://localhost/stove/services/SayHiService"/>

    </wsdl:port>

  </wsdl:service>

</wsdl:definitions>

 這個檔案跟我們用Axis生成的基本是一樣的。

5、享受美味的時刻

WebService這道大餐算是烹製好了,現在是享用美餐的時候了。

我們寫一個客戶端吃掉這道大餐:

Java程式碼 

package cn.com.pansky.webservice.xfire.study;

import java.net.MalformedURLException;

import java.util.Map;

import org.codehaus.xfire.client.Client;

import org.codehaus.xfire.client.XFireProxyFactory;

import org.codehaus.xfire.service.Service;

import org.codehaus.xfire.service.binding.ObjectServiceFactory;

import org.codehaus.xfire.transport.http.CommonsHttpMessageSender;

public class SayHiClient{

  public static void main(String args[]) {

    String serviceURL = "http://localhost/stove/services/SayHiService";

    Service serviceModel = new ObjectServiceFactory().create(SayHiService.class,null,"http://cn.com.pansky/SayHiService",null);

    XFireProxyFactory serviceFactory = new XFireProxyFactory();

    try{

      SayHiService service = (SayHiService) serviceFactory.create(serviceModel, serviceURL);

      Client client = Client.getInstance(service);

      //client.addOutHandler(new OutHeaderHandler());

      // disable timeout

      client.setProperty(CommonsHttpMessageSender.HTTP_TIMEOUT, "1");

      String hello = service.sayHi("張山瘋");

      System.out.println("伺服器對[張山瘋的回答是:" + hello );

      hello = service.sayHi(null);

      System.out.println("伺服器胡言亂語說:" + hello );

    } catch (MalformedURLException e) {

      e.printStackTrace();

    }

  }

}

 編譯這個類,再執行一下,伺服器服務的結果是:

2008-5-22 17:39:17 org.apache.commons.httpclient.HttpMethodBase writeRequest

資訊: 100 (continue) read timeout. Resume sending the request

2008-5-22 17:39:17 org.apache.commons.httpclient.HttpMethodBase readResponse

資訊: Discarding unexpected response: HTTP/1.1 100 Continue

伺服器對[張山瘋的回答是:張山瘋你吃了嗎?沒吃回家吃去吧。

2008-5-22 17:39:20 org.apache.commons.httpclient.HttpMethodBase writeRequest

資訊: 100 (continue) read timeout. Resume sending the request

2008-5-22 17:39:20 org.apache.commons.httpclient.HttpMethodBase readResponse

資訊: Discarding unexpected response: HTTP/1.1 100 Continue

伺服器胡言亂語說:連名字也不肯告訴我嗎?

好了,WebService佈署成功。

到這就結束了,有問題給我留言吧!

相關推薦

webService其它程式提供介面示例建立wsdl檔案

Web Service實踐之——開始XFire 一、Axis與XFire的比較 XFire是與Axis2 並列的新一代WebService平臺。之所以並稱為新一代,因為它: 1、支援一系列Web Service的新標準--JSR181、WSDL2.0 、JAXB2、WS-Security等; 2、使用St

Nginx反向代理豆瓣API介面程式提供資料

因為近來豆瓣的開發者平臺已經無限期的下線,而且由於很多小程式直接請求豆瓣的介面,導致了豆瓣做了防盜鏈的,小程式完全不能開啟。 但是伺服器端用curl發現是可以訪問,那麼我們不如自己做一個反向代理,為我們自己的小程式提供一箇中轉站。下面不BB了,直接貼程式碼 Nginx端:【因為小程式必須要用https協議

ASP NET後臺移動端提供介面

                 引言       &n

Com1被佔用其它程式繼續使用Com1將導致錯誤

今天電腦藍屏以後,com1埠不能讀取電子地磅的資料了,鬱悶了半天,重啟之後發現 有一個驅動在更新Serial BallPoint,後來百度了這個東西,終於有人說 原來Com口連線的GPS裝置,因為滿足了微軟對Serial ballpoint裝置的檢測要求,被微軟誤認為Com

Kubernetes叢集提供反向代理從叢集外部通過標準http埠訪問kube-Dashboard等內部應用

安裝Ingress Controller Ingress Controller運行於k8s叢集的容器內,既讓每臺node監聽80和443埠,為來自叢集外部的請求提供反向代理,又能實時監聽叢集內Ingress配置,自動更新反向代理規則。 部署de

【Java】微信小程式imgSecCheck介面示例-校驗一張圖片是否含有違法違規內容

  近期應該部分個人開發者小程式會收到如下通知 為了快速解決問題,就直接使用官方提供的介面 imgSecCheck校驗一張圖片是否含有違法違規內容 個人小程式只是圖片的一些處理識別。固只拿imgSecChec

程式新增業務域名校驗檔案下載到伺服器問題

在填寫業務域名時,小程式要求咱們下載他們的校驗檔案,放到根目錄,通常是沒有問題,滿足能夠訪問,確定放在根目錄下就行 以下是域名繫結小程式的注意事項: 一個域名只能繫結20個小程式 域名可以是子

從資料庫中讀取資料建立XML檔案並更新維護XML

public class OperateXML { /// <summary> /// 檔案全路徑 /// </summary> private string fullF

用shell實現將動態ip修改靜態ip靜態ip修改其它靜態ip

linux 用shell修改ip (1) 將動態ip修改為靜態ip的思路 ① 修改ip之前,先備份ifcfg-eth0文件 ② 進入網卡配置目錄 /etc/sysconfig/network-scripts/ifcfg-eth0 ③ 修改BOOTPROTO=static ④ 修

Webservice報錯客戶端發現響應內容類型“application/json;charset=UTF-8”但應“text/xml”。

san 有關 棧跟蹤 手動 cat mil not soap con 控制臺對接Webservice正常,同樣的方法在Web項目上報錯: 客戶端發現響應內容類型為“application/json;charset=UTF-8”,但應為“

袁帥:客戶提供增值服務打破互“聯網+會議會展”盈利困局

互聯網+會議會展 互聯網+會議 互聯網+會務 互聯網+ 袁帥 當下,信息化、數字化科技技術正在促使會議、展會等市場品牌營銷活動進行著變革與升級!如果說若幹年前,“互聯網+會務”處於模式摸索階段,那經過這幾年的發展與校正,可以說模式已經逐漸明晰並歸於穩定。“互聯網+會務”主要通過兩個切口切入

入門python程式:分支迴圈break和continue使用示例

分支迴圈是用腦示例 score = int(input("請輸入一個分數:")) if 100 > score >=90 : print("A") elif 90 > score >=80: print("B") elif 80 > scor

Linux下應用程式新增桌面圖示(ubuntu18.4)

一、桌面圖示位置 Lniux下桌面圖示儲存路徑為:/usr/share/applications   二、桌面圖示格式 所有桌面圖示格式均為desktop,即名為XXX.desktop   三、編輯內容(常用) // 檔案頭(必須) [Desktop Entry] /

程式設計師:此處不留爺自有留爺處

"我自己是一名從事了8年的j a v a全棧開發工程師,辭職目前在做線上教育講師,來了就是我學生,有不懂的可以問我 今年4月我花了一個月整理了一套比較系統適合2018年學習的 j a v a資料,從基礎的面向物件到執行緒, j d b c都有整理,送給每一位小夥伴,這裡是學習者聚集地,如果你

python學習之網站的編寫(HTMLCSSJS)(十五)----------示例彈出一個背景半黑色前面是白框的彈窗功能(已經編好的框架)

效果圖,程式碼直接可應用,按自己的需要在其中加入想要的內容:  程式碼及講解: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <

MFC入門(一)-- 第一個簡單的windows圖形化介面程式(開啟計算器記事本查IP)

////////////////////////////////序////////////////////////////////   大約三年前,學過一些簡單的程式語言之後其實一直挺苦惱於所寫的程式總是拘泥於用的編譯器,脫離了編譯環境基本沒執行的可行性,故而寫一個在任意windows電腦下都能

程式設計師爆料:阿里很多人離職只在小公司當管理只說話不做事

如今國內,BAT可謂勢頭正盛!但是就綜合各項而言,阿里還是要強上一籌。阿里自從上個世紀末誕生以來,陸續推出了很多的應用和APP,其中要以支付寶和淘寶等出名了,因此也沒有人懷疑阿里的實力。 但是近日,卻有程式設計師網友稱: 據這位阿里的內部程式設計師爆料,在阿里只會Curd的那種程式

shell實現將動態ip修改靜態ip靜態ip修改其它靜態ip

 shell實現將動態ip修改為靜態ip,靜態ip修改為其它靜態ip (1) 將動態ip修改為靜態ip的思路    ① 修改ip之前,先備份ifcfg-eth0檔案    ②  進入網絡卡配置目錄  /etc/sysconfi

微信小程式全域性狀態管理提供Vuex的開發體驗

1. 概要 微信小程式的開發體驗類似vue和react,但是卻沒有提供全域性狀態管理的機制,所以狀態的共享只能通過屬性傳遞的方式來實現。這種做法在小規模的應用中尚可以滿足開發效率,但是在複雜的應用中元件的巢狀層次很深,屬性傳遞的路徑過長。 於是我就想利用小程式Page中的data

去年裁撤34歲以上程式設計師淨利潤不減反增程式設計師坐不住了

2017年3月份,網上傳來一則關於華為的訊息,公司裁撤34歲以上交付工程維護人員,研發部分則開始集中清退40歲以上老員工,其中程式設計師佔了大部分。為何華為會在自己的巔峰期裁撤34歲以上員工?難道就不怕自己受到影響嗎?1年過去了,似乎這個事件並沒有影響到華為什麼,根據2017年財報,華為理論不減反增