SpringBoot整合WebService的實(shí)戰(zhàn)案例
WebService
Web服務(wù)(Web Services)是一種基于網(wǎng)絡(luò)的標(biāo)準(zhǔn)化的軟件系統(tǒng),允許不同的應(yīng)用程序通過網(wǎng)絡(luò)相互通信和交互。它們使用標(biāo)準(zhǔn)化的網(wǎng)絡(luò)協(xié)議和數(shù)據(jù)格式,使得不同平臺(tái)、不同語言編寫的應(yīng)用程序能夠互相通信和交換數(shù)據(jù)。
在現(xiàn)代軟件開發(fā)中,構(gòu)建可靠的Web服務(wù)是至關(guān)重要的。Apache CXF是一個(gè)功能強(qiáng)大的Java框架,用于構(gòu)建Web服務(wù)和Web應(yīng)用程序。結(jié)合Spring Boot,我們可以快速搭建一個(gè)簡(jiǎn)單的WebService。本文將介紹如何使用Apache CXF和Spring Boot創(chuàng)建一個(gè)簡(jiǎn)單的WebService,并進(jìn)行基本的測(cè)試。
1.簡(jiǎn)單介紹WebService
1.1. 類型
Web服務(wù)通常分為兩種主要類型:
- SOAP Web服務(wù):基于SOAP(Simple Object Access Protocol)協(xié)議的Web服務(wù)。SOAP是一種用于交換結(jié)構(gòu)化信息的協(xié)議,它使用XML作為消息格式,并通常通過HTTP協(xié)議進(jìn)行傳輸。
- RESTful Web服務(wù):基于REST(Representational State Transfer)原則的Web服務(wù)。RESTful服務(wù)使用標(biāo)準(zhǔn)的HTTP方法(如GET、POST、PUT、DELETE)來執(zhí)行操作,并通常返回JSON或XML格式的數(shù)據(jù)。
1.2. 架構(gòu)
Web服務(wù)的架構(gòu)通常包括以下關(guān)鍵組件:
- 服務(wù)提供者(Service Provider):提供Web服務(wù)的實(shí)體。它們發(fā)布服務(wù)并處理來自客戶端的請(qǐng)求。
- 服務(wù)請(qǐng)求者(Service Requestor):使用Web服務(wù)的客戶端應(yīng)用程序。它們向服務(wù)提供者發(fā)送請(qǐng)求并處理響應(yīng)。
- 服務(wù)描述(Service Description):Web服務(wù)的描述文件,通常使用WSDL(Web Services Description Language)或OpenAPI等格式來描述服務(wù)的接口和操作。
- 消息格式(Message Format):Web服務(wù)使用的數(shù)據(jù)交換格式,通常是XML或JSON。
- 通信協(xié)議(Communication Protocol):Web服務(wù)之間通信的協(xié)議,常見的包括HTTP、HTTPS、SMTP等。
1.3. 主要特點(diǎn)
Web服務(wù)具有以下主要特點(diǎn):
- 跨平臺(tái)性(Platform Independence):由于Web服務(wù)使用標(biāo)準(zhǔn)化的協(xié)議和數(shù)據(jù)格式,因此它們可以在不同的平臺(tái)和操作系統(tǒng)上運(yùn)行。
- 松耦合(Loose Coupling):Web服務(wù)通過標(biāo)準(zhǔn)化接口進(jìn)行通信,服務(wù)提供者和請(qǐng)求者之間的耦合度較低,可以獨(dú)立開發(fā)和部署。
- 可組合性(Composability):可以通過組合多個(gè)Web服務(wù)來創(chuàng)建復(fù)雜的應(yīng)用程序。
- 可重用性(Reusability):Web服務(wù)可以被多個(gè)應(yīng)用程序重復(fù)使用,從而提高了軟件開發(fā)效率。
- 易于維護(hù)(Maintainability):由于Web服務(wù)使用標(biāo)準(zhǔn)化的接口和協(xié)議,因此易于維護(hù)和更新。
1.4. 使用場(chǎng)景
Web服務(wù)在許多場(chǎng)景下都得到了廣泛應(yīng)用,包括但不限于:
- 企業(yè)應(yīng)用集成(Enterprise Application Integration,EAI):將不同的企業(yè)應(yīng)用程序和系統(tǒng)集成在一起,實(shí)現(xiàn)數(shù)據(jù)和業(yè)務(wù)流程的無縫交互。
- 分布式系統(tǒng):構(gòu)建分布式系統(tǒng)和服務(wù)導(dǎo)向架構(gòu)(Service-Oriented Architecture,SOA),提供跨網(wǎng)絡(luò)的服務(wù)和資源共享。
- 移動(dòng)應(yīng)用程序開發(fā):通過Web服務(wù)為移動(dòng)應(yīng)用程序提供數(shù)據(jù)和功能支持,與后端服務(wù)器進(jìn)行通信和交互。
- 云計(jì)算:在云平臺(tái)上部署和管理Web服務(wù),提供云端服務(wù)和資源。
1.5. Web服務(wù)標(biāo)準(zhǔn)和技術(shù)
一些常見的Web服務(wù)標(biāo)準(zhǔn)和技術(shù)包括:
- SOAP(Simple Object Access Protocol):用于構(gòu)建基于XML的Web服務(wù)的協(xié)議。
- WSDL(Web Services Description Language):用于描述Web服務(wù)的接口和操作的XML格式的語言。
- UDDI(Universal Description, Discovery, and Integration):用于注冊(cè)和發(fā)現(xiàn)Web服務(wù)的協(xié)議和規(guī)范。
- REST(Representational State Transfer):一種基于HTTP協(xié)議的軟件架構(gòu)風(fēng)格,用于構(gòu)建RESTful Web服務(wù)。
- JSON(JavaScript Object Notation):一種輕量級(jí)的數(shù)據(jù)交換格式,通常用于RESTful Web服務(wù)的數(shù)據(jù)格式。
2.案例-WebServiceDemo
2.1.引入配置文件
首先,我們需要在項(xiàng)目中添加必要的依賴項(xiàng)。這些依賴項(xiàng)將幫助我們集成Apache CXF到Spring Boot應(yīng)用程序中。我的使用的是gradle構(gòu)建的項(xiàng)目
// 引入WebService implementation 'org.apache.cxf:cxf-rt-frontend-jaxws:3.2.0' implementation 'org.apache.cxf:cxf-rt-transports-http:3.2.0'
<dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxws</artifactId> <version>3.2.0</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http</artifactId> <version>3.2.0</version> </dependency>
2.2.創(chuàng)建接口
import com.fhr.student.entity.Student; import javax.jws.WebParam; import javax.jws.WebService; @WebService public interface StudentService { /** * 根據(jù)姓名獲取學(xué)生信息 * @param userName 學(xué)生姓名 * @return 學(xué)生信息 */ Student getStudentInfoByName(@WebParam(name = "userName")String userName); }
2.3.創(chuàng)建接口實(shí)現(xiàn)類
import com.fhr.service.StudentService; import com.fhr.student.entity.Student; import org.springframework.stereotype.Component; import javax.jws.WebService; /** * targetNamespace:目標(biāo)命名控件,一般由接口所在包路徑命名,不過是由里往外寫:比如:我接口所在路徑為:com.fhr.service 寫為:http://service.fhr.com/ */ @Component @WebService(targetNamespace = "http://service.fhr.com/",endpointInterface = "com.fhr.service.StudentService") public class StudentImpl implements StudentService { /** * 根據(jù)學(xué)生姓名獲取學(xué)生信息 * @param userName 學(xué)生姓名 * @return 學(xué)生信息 */ @Override public Student getStudentInfoByName(String userName) { // TODO這里應(yīng)該查詢數(shù)據(jù)庫(kù) System.out.println("傳入的參數(shù)為:"+userName); Student student = new Student(); student.setUserName(userName); student.setClassName("高三一班"); student.setAge(14); return student; } }
2.4.創(chuàng)建WebService配置類
我們需要配置CXF和發(fā)布WebService的端點(diǎn)。我們使用Spring Boot的配置類來完成這個(gè)任務(wù)。
import com.fhr.service.StudentService; 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 WebServiceConfig { // 創(chuàng)建一個(gè)SpringBus Bean,作為Apache CXF的默認(rèn)總線 @Bean(name = Bus.DEFAULT_BUS_ID) public SpringBus springBus() { return new SpringBus(); } // 注冊(cè)CXF Servlet,用于處理WebService請(qǐng)求 @Bean(name = "wbsBean") public ServletRegistrationBean dispatcherServlet() { // 創(chuàng)建一個(gè)ServletRegistrationBean,將CXFServlet映射到指定路徑 ServletRegistrationBean wbsServlet = new ServletRegistrationBean(new CXFServlet(), "/wbs/*"); return wbsServlet; } // 定義WebService端點(diǎn) @Bean public Endpoint endpointPurchase(SpringBus springBus, StudentService studentService) { // 創(chuàng)建EndpointImpl對(duì)象,并將SpringBus和WebService實(shí)現(xiàn)類傳入 EndpointImpl endpoint = new EndpointImpl(springBus, studentService); // 將端點(diǎn)發(fā)布到指定路徑 endpoint.publish("/user-server"); // 打印發(fā)布成功消息,顯示服務(wù)的訪問地址 System.out.println("服務(wù)發(fā)布成功!地址為:http://localhost:8081/wbs/user-server"); // 返回端點(diǎn)對(duì)象 return endpoint; } }
2.5.測(cè)試
啟動(dòng)項(xiàng)目后,您可以在瀏覽器中輸入http://localhost:8081/wbs/user-server?wsdl來查看WebService的WSDL文檔。
# 啟動(dòng)項(xiàng)目 在瀏覽器的地址中輸入 http://localhost:8081/wbs/user-server?wsdl
# 測(cè)試客戶端 為了方便直接在本地項(xiàng)目測(cè)試 在瀏覽器中輸入 測(cè)試
import org.apache.cxf.endpoint.Client; import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/stu") public class StudentController { // 定義了一個(gè)映射到路徑"/stu/getUserInfoByName"的GET請(qǐng)求處理方法 @GetMapping("/getUserInfoByName") public Object[] getUserInfoByName(@RequestParam("name")String name){ // 創(chuàng)建JaxWsDynamicClientFactory實(shí)例,用于動(dòng)態(tài)創(chuàng)建客戶端 JaxWsDynamicClientFactory proxyFactoryBean = JaxWsDynamicClientFactory.newInstance(); // 使用動(dòng)態(tài)客戶端工廠創(chuàng)建客戶端對(duì)象,并指定WebService的WSDL地址 Client client = proxyFactoryBean.createClient("http://localhost:8081/wbs/user-server?wsdl"); // 定義一個(gè)Object數(shù)組用于存儲(chǔ)調(diào)用WebService方法后的返回結(jié)果 Object[] objects = new Object[0]; // 調(diào)用遠(yuǎn)程WebService方法 try { // 調(diào)用客戶端的invoke方法,傳入方法名和參數(shù),獲取WebService方法的返回結(jié)果 objects = client.invoke("getStudentInfoByName", name); } catch (Exception e) { // 捕獲異常,打印異常信息 e.printStackTrace(); } // 返回WebService方法的返回結(jié)果 return objects; } }
總結(jié)
到此這篇關(guān)于SpringBoot整合WebService的文章就介紹到這了,更多相關(guān)SpringBoot整合WebService內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Spring boot webService使用方法解析
- SpringBoot調(diào)用第三方WebService接口的操作技巧(.wsdl與.asmx類型)
- SpringBoot整合WebService的實(shí)現(xiàn)示例
- SpringBoot創(chuàng)建WebService方法詳解
- SpringBoot調(diào)用第三方WebService接口的兩種方法
- SpringBoot調(diào)用對(duì)方webService接口的幾種方法示例
- springboot整合webservice使用簡(jiǎn)單案例總結(jié)
- Java(Springboot)項(xiàng)目調(diào)用第三方WebService接口實(shí)現(xiàn)代碼
相關(guān)文章
使用spring+maven不同環(huán)境讀取配置方式
這篇文章主要介紹了使用spring+maven不同環(huán)境讀取配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08Java 實(shí)現(xiàn)協(xié)同過濾算法推薦算法的示例代碼
本文介紹了協(xié)同過濾算法的概念,包括基于用戶的協(xié)同過濾和基于物品的協(xié)同過濾,文章詳細(xì)解釋了數(shù)據(jù)準(zhǔn)備、相似度計(jì)算以及如何在Java中實(shí)現(xiàn)這些算法,通過一個(gè)簡(jiǎn)單的用戶-物品評(píng)分矩陣示例,展示了如何計(jì)算用戶和物品之間的相似度,并推薦未評(píng)分的物品,感興趣的朋友一起看看吧2025-02-02Java面向?qū)ο笾^承、構(gòu)造方法、重寫、重載
本章具體介紹了什么是構(gòu)造方法、繼承、重寫、重載以及創(chuàng)建方法,整篇文章用老司機(jī)和人類來舉例,圖解穿插代碼案例,需要的朋友可以參考下2023-03-03Linux中Elasticsearch的安裝詳細(xì)步驟
這篇文章主要介紹了Linux中Elasticsearch的安裝詳細(xì)步驟,Elasticsearch(ES)是一種分布式、可擴(kuò)展的搜索和分析引擎,基于Lucene構(gòu)建,它支持實(shí)時(shí)數(shù)據(jù)處理、全文搜索、實(shí)時(shí)分析等多種功能,需要的朋友可以參考下2024-12-12Java解壓縮zip - 解壓縮多個(gè)文件或文件夾實(shí)例
本篇文章主要介紹了Java解壓縮zip - 解壓縮多個(gè)文件或文件夾實(shí)例,非常具有實(shí)用價(jià)值,有需要的可以了解一下。2016-12-12SpringBoot使用Filters實(shí)現(xiàn)請(qǐng)求過濾和預(yù)處理
過濾器(Filter)是一種在Web應(yīng)用中用于攔截和處理HTTP請(qǐng)求和響應(yīng)的對(duì)象,在Java Web開發(fā)中,過濾器是實(shí)現(xiàn)特定功能,如認(rèn)證、日志記錄和字符編碼處理的重要工具,本文主要介紹了SpringBoot使用Filters實(shí)現(xiàn)請(qǐng)求過濾和預(yù)處理,需要的朋友可以參考下2024-08-08