首頁 > Java > java教程 > 主體

webservice怎麼實作springboot專案間接口呼叫與物件傳遞

WBOY
發布: 2023-06-03 12:09:06
轉載
1748 人瀏覽過

一、百度百科

Web Service是一個平台獨立的,低耦合的,自包含的、基於可編程的web的應用程序,可使用開放的XML(標準通用標記語言下的一個子集)標準來描述、發布、發現、協調和配置這些應用程序,用於開發分散式的互動操作的應用程式。

Web Service技術, 能使得運行在不同機器上的不同應用無須借助附加的、專門的第三方軟體或硬件, 就可相互交換數據或集成。依據Web Service規範實施的應用之間, 無論它們所使用的語言、 平台或內部協定是什麼, 都可以相互交換資料。 Web Service是一種可用於網路的自包含、自描述模組,可執行具體的業務功能。 Web Service也很容易部署, 因為它們基於一些常規的產業標準以及已有的一些技術,諸如標準通用標記語言下的子集XML、HTTP。 Web Service減少了應用介面的花費。 Web服務提供了一種通用機制,用於整合整個企業甚至多個組織之間的業務流程。

二、webservice的技術支援

要實現分散式應用程式的創建,Web Service平台必須採用一套協定。任何平台都有它的資料表示方法和類型系統。要實現互通性,Web Service平台必須提供一套標準的類型系統,用於溝通不同平台、程式語言和元件模型中的不同類型系統。這些協定有:

1、XML和XSD

XML是一種用於標記電子檔案使其具有結構性的標記語言,是Web Service平台中表示資料的基本格式。除了易於建立和易於分析外,XML主要的優點在於它既與平台無關,又與廠商無關。 XML遵循 W3C 規範的語法要求,形式與內容分離,具有良好的自描述性,同時易於擴展,擁有豐富的第三方開發庫,非常適合在不同架構的系統之間進行資訊傳輸使用。隨著XML的應用越來越廣泛,在許多應用場景下,XML憑藉其優點已成為事實上的資料交換標準。 XML是由萬維網協會(W3C)創建,W3C制定的XML SchemaXSD定義了一套標準的資料類型,並給出了一種語言來擴展這套資料類型。
Web Service平台是用XSD來當作資料型別系統的。當你用某種語言如VB. NET或C# 來建構一個Web Service時,為了符合Web Service標準,所有你所使用的資料型別都必須轉換成XSD型別。如想讓它使用在不同平台和不同軟體的不同組織間傳遞,還需要用某些東西將它包裝起來。這種東西就是一種協議,如 SOAP。

2、SOAP

SOAP即簡單物件存取協定(Simple Object Access Protocol),它是用來交換XML(標準通用標記語言下的子集)編碼資訊的輕量級級協議,能夠在不同資訊系統之間交換結構化數據,是Web Service的一種主流實現形式。它有三個主要面向:XML-envelope為描述資訊內容和如何處理內容定義了框架,將程式物件編碼成為XML物件的規則,執行遠端過程呼叫(RPC)的約定。 SOAP可以運作在任何其他傳輸協定上。

SOAP基於HTTP協定定義了一個框架,描述訊息中的內容是什麼、是誰發送的、誰應接受並處理它以及如何處理它們。它透過定義SOAP信封(Envelop)來實現資料格式的標準化,將XML資料封裝於信封之中進行資訊交互,使得異構的系統間能夠進行互通。
Web Service 希望實現不同的系統之間能夠以“軟體-軟體對話”的方式相互調用,打破了軟體應用、網站和各種設備之間的格格不入的狀態,實現“基於Web無縫集成”的目標。

3、WSDL

Web Service描述語言WSDL 就是用機器能閱讀的方式提供的一個正式描述文件而基於XML(標準通用標記語言下的一個子集)的語言,用於描述Web Service及其函數、參數和傳回值。因為是基於XML的,所以WSDL既是機器可閱讀的,也是人可閱讀的。

4、UDDI

UDDI 的目的是為電子商務建立標準;UDDI是一套基於Web的、分散式的、為Web Service提供的、資訊註冊中心的實現標準規範,同時也包含一組使企業能將自身提供的Web Service註冊,以使別的企業能夠發現的存取協議的實現標準。

5、呼叫RPC與訊息傳遞

Web Service本身其實是在實作應用程式間的通訊。我們可以使用兩種方式來實現應用程式之間的通訊:遠端過程呼叫(RPC)和訊息傳遞。使用RPC的時候,客戶端的概念是呼叫伺服器上的遠端過程,通常方式為實例化一個遠端物件並呼叫其方法和屬性。 RPC系統試圖達到一種位置上的透明性:伺服器暴露出遠端物件的接口,而客戶端就好像在本地使用的這些物件的介面一樣,這樣就隱藏了底層的信息,客戶端也就根本不需要知道對像是在哪台機器上。

三、webservice的應用場景和弊端

1、webservice的應用程式場景

長項1:跨防火牆的通訊
如果應用程式有成千上萬的用戶,而且分佈在世界各地,那麼客戶端和伺服器之間的通訊將是一個棘手的問題。因為客戶端和伺服器之間通常會有防火牆或代理伺服器。在這種情況下,使用DCOM就不是那麼簡單,通常也不便於把客戶端程式發佈到數量如此龐大的每一個用戶手中。傳統的做法是,選擇用瀏覽器作為客戶端,寫下一大堆ASP頁面,把應用程式的中間層暴露給最終用戶。這樣做的結果是開發難度高,程式很難維護。

如果中間層元件換成WebService的話,就可以從使用者介面直接呼叫中間層元件,從而省掉建立ASP頁面的那一步。要呼叫WebService,可以直接使用MicrosoftSOAPToolkit或.NET這樣的SOAP客戶端,也可以使用自己開發的SOAP客戶端,然後把它和應用程式連接起來。不僅縮短了開發週期,還減少了程式碼複雜度,並能夠增強應用程式的可維護性。應用程式無需每次呼叫中間層元件時都導航到對應的「結果頁」。

企業級的應用程式開發者都知道,企業裡經常都要把用不同語言寫成的、在不同平台上運行的各種程式整合起來,而這種整合將花費很大的開發力量。應用程式經常需要從運行在IBM主機上的程式中取得資料;或把資料傳送到主機或UNIX應用程式中去。各種軟體通常需要在同一平台上集成,即使它們來自不同的軟體廠商。其他應用程式可以使用標準方法來存取透過WebService公開的功能和資料。

長項2:應用程式整合
企業級的應用程式開發者都知道,企業裡常常都要把用不同語言寫成的、在不同平台上運行的各種程式整合起來,而這種整合將花費很大的開發力量。應用程式經常需要從運行在IBM主機上的程式中取得資料;或把資料傳送到主機或UNIX應用程式中去。各種軟體通常需要在同一平台上集成,即使它們來自不同的軟體廠商。其他應用程式可以使用標準方法來存取透過WebService公開的功能和資料。

例如,有一個訂單登入程序,用於登入從客戶來的新訂單,包括客戶資訊、發貨地址、數量、價格和付款方式等內容;還有一個訂單執行程序,用於實際貨物發送的管理。這兩個程式來自不同軟體廠商。當有新訂單到達時,訂單登入程序將會通知訂單執行程序發送貨物。透過在訂單執行程序上面增加一層WebService,訂單執行程序可以把「AddOrder」函數「暴露」出來。這樣,每當有新訂單到來時,訂單登入程序就可以呼叫這個函數來發送貨物了。

長項3:B2B的整合
用WebService整合應用程序,可以讓公司內部的商務處理更加自動化。但當交易跨越供應商和客戶、突破公司的界線時會怎麼樣呢?跨公司的商務交易整合通常叫做B2B整合。

WebService是B2B整合成功的關鍵。透過WebService,公司可以把關鍵的商務應用程式「暴露」給指定的供應商和客戶。例如,把電子下單系統和電子發票系統「暴露」出來,客戶就可以以電子的方式發送訂單,供應商則可以以電子的方式發送原料採購發票。當然,這並不是新的概念,EDI(電子文檔交換)早就是這樣了。但是,WebService的實作要比EDI簡單得多,而且WebService運行在Internet上,在世界任何地方都可輕易實現,其運作成本就相對較低。不過,WebService並不像EDI那樣,是文件交換或B2B整合的完整解決方案。要實現集成,除了WebService,還需要許多其他組成部分。

用WebService來實現B2B整合的最大好處在於可以輕易實現互通性。只要把商務邏輯「揭露」出來,成為WebService,就可以讓任何指定的合作夥伴呼叫這些商務邏輯,而不管他們的系統在什麼平台上運行,使用什麼開發語言。這樣就大幅減少了花在B2B整合的時間和成本,讓許多原本無法承受EDI的中小企業也能實現B2B整合。
軟體與資料重複使用

"Software reuse is a significant topic with many forms and varying degrees of implementation."。最基本的形式是原始碼模組或類別一級的重用,另一種形式是二進位形式的元件重用。

目前,像是表格控制項或使用者介面控制項這樣的可重複使用軟體元件,在市場上都佔有很大的份額。重複使用這類軟體的限制非常大,因為它僅限於程式碼,而資料是不能重複使用的。原因在於,發布元件甚至原始碼都比較容易,但要發布資料就沒那​​麼容易,除非是不會經常變化的靜態資料。

重複使用程式碼的同時,webService也能夠重複使用資料背後的程式碼。使用WebService,再也不必像以前那樣,要先從第三方購買、安裝軟體元件,再從應用程式中呼叫這些元件;只需要直接呼叫遠端的WebService就可以了。舉個例子,要在應用程式中確認用戶輸入的地址,只需把這個地址直接發送給相應的WebService,這個WebService就會幫你查閱街道地址、城市、省區和郵政編碼等信息,確認這個地址是否在相應的郵遞區號區域。 WebService的提供者可以採用按時間或按使用次數的方式對該服務進行收費。這樣的服務要透過元件重用來實現是不可能的,那樣的話你必須下載並安裝好包含街道地址、城市、省區和郵遞區號等資訊的資料庫,而且這個資料庫還是不能即時更新的。

另一種軟體重用的情況是,把好幾個應用程式的功能整合起來。例如,要建立一個區域網路上的入口網站應用,讓使用者既可以查詢聯邦快遞包裹,查看股市行情,又可以管理自己的日程安排,還可以在線購買電影票。現在Web上有許多應用程式供應商,都在其應用中實現了這些功能。一旦他們把這些功能都透過WebService「暴露」出來,就可以非常容易地把所有這些功能都整合到你的入口網站中,為使用者提供一個統一的、友善的介面。

將來,許多應用程式都會利用WebService,把目前基於元件的應用程式結構擴展為元件/WebService的混合結構,可以在應用程式中使用第三方的WebService提供的功能,也可以把自己的應用程式功能透過WebService提供給別人。兩種情況下,都可以重複使用程式碼和程式碼背後的資料。

2、webservice的弊端

短處1:單機應用程式

目前,企業和個人也使用著許多桌面應用程式。其中一些只需要與本機上的其它程式通訊。在這種情況下,最好使用本機API,避免使用WebService。 COM非常適合在這種情況下工作,因為它既小又快。運行在同一台伺服器上的伺服器軟體也是這樣。最好直接用COM或其它本地的API來進行應用程式間的呼叫。雖然WebService也適用於這些情境,但這會消耗很多資源,並且不會有任何實質的收益。

短處2:區域網路的同構應用程式
在許多應用程式中,所有的程式都是用VB或VC開發的,都在windows平台下使用COM,都運行在同一個區域網路上。例如,有兩個伺服器應用程式需要相互通信,或有一個Win32或WinForm的客戶程式要連接區域網路上另一個伺服器的程式。在這些程式裡,使用DCOM會比SOAP/http有效得多。與此相類似,如果一個.NET程式要連接到區域網路上的另一個.NET程序,則應該使用.NETremoting。有趣的是,在.NETremoting中,也可以指定使用SOAP/http來進行WebService呼叫。不過最好還是直接透過TCP進行RPC調用,那樣會有效得多。

總之,只要從應用程式結構的角度來看,有別的方法比WebService更有效、更可行,那就不要用WebService。

四、webservice程式碼實例

實作不同項目間接口調動,並透過webservice傳遞物件資料~

服務端項目代碼

1、pom

<!--webservice-->
<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-web-services</artifactId>
 </dependency>
 <dependency>
     <groupId>org.apache.cxf</groupId>
     <artifactId>cxf-rt-frontend-jaxws</artifactId>
     <version>3.1.12</version>
 </dependency>
 <dependency>
     <groupId>org.apache.cxf</groupId>
     <artifactId>cxf-rt-transports-http</artifactId>
     <version>3.1.12</version>
 </dependency>
登入後複製

2、config設定類別

package com.guor.config;

import com.guor.service;
import com.guor.service.implImpl;
import org.apache.cxf.Bus;
import org.apache.cxf.bus.spring.SpringBus;
import org.apache.cxf.jaxws.EndpointImpl;
import org.apache.cxf.transport.servlet.CXFServlet;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.xml.ws.Endpoint;

@Configuration
public class CxfConfig {

    @Bean
    public ServletRegistrationBean createServletRegistrationBean() {
        return new ServletRegistrationBean(new CXFServlet(), "/WebService/*");
    }

    @Bean(name = Bus.DEFAULT_BUS_ID)
    public SpringBus springBus() {
        return new SpringBus();
    }

    @Bean
    public WebService myService() {
        return new WebServiceImpl();
    }

    @Bean
    public Endpoint endpoint() {
        EndpointImpl endpoint = new EndpointImpl(springBus(), myService());
        endpoint.publish("/api");
        return endpoint;
    }

}
登入後複製

3、介面

package com.guor.service;

import com.guor.entity.dto.User;

import javax.jws;

@WebService(name = "WebService", // 暴露服务名称
        targetNamespace = "http://service.guor.com"// 命名空间,一般是接口的包名倒序
)
public interface WebService {

    User sendInfo(User user);
}
登入後複製
登入後複製
package com.guor.service.impl;

import com.guor.entity.dto.User;
import com.guor.service;
import org.springframework.stereotype.Service;

import javax.jws;


@WebService(serviceName = "WebService", // 与接口中指定的服务name一致
        targetNamespace = "http://service.guor.com", // 与接口中的命名空间一致,一般是接口的包名倒
        endpointInterface = "com.guor.service"// 接口地址
)
@Service
public class WebServiceImpl implements WebService {

    @Override
    public User sendInfo(User user) {
        return user;
    }
}
登入後複製

 客戶端專案程式碼:

1、建立一個一模一樣的介面

package com.guor.service;

import com.guor.entity.dto.User;

import javax.jws;

@WebService(name = "WebService", // 暴露服务名称
        targetNamespace = "http://service.guor.com"// 命名空间,一般是接口的包名倒序
)
public interface WebService {

    User sendInfo(User user);
}
登入後複製
登入後複製

2、webservice工具類別

 /**
     * webservice接口地址
     */
    private static String address = "http://10.4.66.7:9992/MyProject/WebService/api?wsdl";

    /**
     * 通过webservice发送EC企业信息
     * @param User
     * @return
     */
    public static User sendInfo(User user) {
        try {
            // 代理工厂
            JaxWsProxyFactoryBean jaxWsProxyFactoryBean = new JaxWsProxyFactoryBean();
            // 设置代理地址
            jaxWsProxyFactoryBean.setAddress(address);
            //添加用户名密码拦截器
            //jaxWsProxyFactoryBean.getOutInterceptors().add(new LoginInterceptor("root","admin"));;
            // 设置接口类型
            jaxWsProxyFactoryBean.setServiceClass(class);
            // 创建一个代理接口实现
            WebService service = (WebService) jaxWsProxyFactoryBean.create();

            return service.sendInfo(user);
        } catch (Exception e) {
            return null;
        }
    }
登入後複製

以上是webservice怎麼實作springboot專案間接口呼叫與物件傳遞的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:yisu.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板