目錄
一、百度百科
二、webservice的技術支援
1、XML和XSD
2、SOAP
3、WSDL
4、UDDI
5、呼叫RPC與訊息傳遞
三、webservice的應用場景和弊端
1、webservice的應用程式場景
2、webservice的弊端
四、webservice程式碼實例
服務端項目代碼
 客戶端專案程式碼:
首頁 Java java教程 webservice怎麼實作springboot專案間接口呼叫與物件傳遞

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

Jun 03, 2023 pm 12:09 PM
springboot webservice

一、百度百科

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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1321
25
PHP教程
1269
29
C# 教程
1249
24
Springboot怎麼整合Jasypt實現設定檔加密 Springboot怎麼整合Jasypt實現設定檔加密 Jun 01, 2023 am 08:55 AM

Jasypt介紹Jasypt是一個java庫,它允許開發員以最少的努力為他/她的專案添加基本的加密功能,並且不需要對加密工作原理有深入的了解用於單向和雙向加密的高安全性、基於標準的加密技術。加密密碼,文本,數字,二進位檔案...適合整合到基於Spring的應用程式中,開放API,用於任何JCE提供者...添加如下依賴:com.github.ulisesbocchiojasypt-spring-boot-starter2. 1.1Jasypt好處保護我們的系統安全,即使程式碼洩露,也可以保證資料來源的

怎麼在SpringBoot中使用Redis實現分散式鎖 怎麼在SpringBoot中使用Redis實現分散式鎖 Jun 03, 2023 am 08:16 AM

一、Redis實現分散式鎖原理為什麼需要分散式鎖在聊分散式鎖之前,有必要先解釋一下,為什麼需要分散式鎖。與分散式鎖相對就的是單機鎖,我們在寫多執行緒程式時,避免同時操作一個共享變數產生資料問題,通常會使用一把鎖來互斥以保證共享變數的正確性,其使用範圍是在同一個進程中。如果換做是多個進程,需要同時操作一個共享資源,如何互斥?現在的業務應用通常是微服務架構,這也意味著一個應用會部署多個進程,多個進程如果需要修改MySQL中的同一行記錄,為了避免操作亂序導致髒數據,此時就需要引入分佈式鎖了。想要實現分

SpringBoot怎麼整合Redisson實現延遲隊列 SpringBoot怎麼整合Redisson實現延遲隊列 May 30, 2023 pm 02:40 PM

使用場景1、下單成功,30分鐘未支付。支付超時,自動取消訂單2、訂單簽收,簽收後7天未進行評估。訂單超時未評價,系統預設好評3、下單成功,商家5分鐘未接單,訂單取消4、配送超時,推播簡訊提醒…對於延時比較長的場景、即時性不高的場景,我們可以採用任務調度的方式定時輪詢處理。如:xxl-job今天我們採

springboot讀取檔案打成jar包後存取不到怎麼解決 springboot讀取檔案打成jar包後存取不到怎麼解決 Jun 03, 2023 pm 04:38 PM

springboot讀取文件,打成jar包後訪問不到最新開發出現一種情況,springboot打成jar包後讀取不到文件,原因是打包之後,文件的虛擬路徑是無效的,只能通過流去讀取。文件在resources下publicvoidtest(){Listnames=newArrayList();InputStreamReaderread=null;try{ClassPathResourceresource=newClassPathResource("name.txt");Input

Springboot+Mybatis-plus不使用SQL語句進行多表新增怎麼實現 Springboot+Mybatis-plus不使用SQL語句進行多表新增怎麼實現 Jun 02, 2023 am 11:07 AM

在Springboot+Mybatis-plus不使用SQL語句進行多表添加操作我所遇到的問題準備工作在測試環境下模擬思維分解一下:創建出一個帶有參數的BrandDTO對像模擬對後台傳遞參數我所遇到的問題我們都知道,在我們使用Mybatis-plus中進行多表操作是極其困難的,如果你不使用Mybatis-plus-join這一類的工具,你只能去配置對應的Mapper.xml文件,配置又臭又長的ResultMap,然後再寫對應的sql語句,這種方法雖然看上去很麻煩,但具有很高的靈活性,可以讓我們

SpringBoot怎麼自訂Redis實作快取序列化 SpringBoot怎麼自訂Redis實作快取序列化 Jun 03, 2023 am 11:32 AM

1.自訂RedisTemplate1.1、RedisAPI預設序列化機制基於API的Redis快取實作是使用RedisTemplate範本進行資料快取操作的,這裡開啟RedisTemplate類,查看該類別的源碼資訊publicclassRedisTemplateextendsRedisAccessorimplementsRedisOperations,BeanClassLoaderAware{//聲明了value的各種序列化方式,初始值為空@NullableprivateRedisSe

SpringBoot與SpringMVC的比較及差別分析 SpringBoot與SpringMVC的比較及差別分析 Dec 29, 2023 am 11:02 AM

SpringBoot和SpringMVC都是Java開發中常用的框架,但它們之間有一些明顯的差異。本文將探究這兩個框架的特點和用途,並對它們的差異進行比較。首先,我們來了解一下SpringBoot。 SpringBoot是由Pivotal團隊開發的,它旨在簡化基於Spring框架的應用程式的建立和部署。它提供了一種快速、輕量級的方式來建立獨立的、可執行

springboot怎麼取得application.yml裡值 springboot怎麼取得application.yml裡值 Jun 03, 2023 pm 06:43 PM

在專案中,很多時候需要用到一些配置信息,這些信息在測試環境和生產環境下可能會有不同的配置,後面根據實際業務情況有可能還需要再做修改。我們不能將這些設定在程式碼中寫死,最好是寫到設定檔中,例如可以把這些資訊寫到application.yml檔案中。那麼,怎麼在程式碼裡取得或使用這個位址呢?有2個方法。方法一:我們可以透過@Value註解的${key}即可取得設定檔(application.yml)中和key對應的value值,這個方法適用於微服務比較少的情形方法二:在實際專案中,遇到業務繁瑣,邏

See all articles