摘要:本文介紹如何在中開發(fā)接口,以及接口如何同時支持和兩種協(xié)議。該功能很簡單,就是通過一個人的姓名查詢這個人的詳細信息。就是關(guān)鍵,如本次請求報文如下就是,對應(yīng)。測試使用進行測試,通過地址導入文件進行測試。測試這樣就實現(xiàn)了和同時提供的目的。
介紹
spring boot web模塊提供了RestController實現(xiàn)restful,第一次看到這個名字的時候以為還有SoapController,很可惜沒有,對于soap webservice提供了另外一個模塊spring-boot-starter-web-services支持。本文介紹如何在spring boot中開發(fā)soap webservice接口,以及接口如何同時支持soap和restful兩種協(xié)議。?
soap webservice?
Web service是一個平臺獨立的,低耦合的,自包含的、基于可編程的web的應(yīng)用程序,既可以是soap webservice也可以是restwebservice,在rest還沒出來之前,我們說webservice一般是指基于soap協(xié)議進行通信的web應(yīng)用程序。??
在開始之前,我覺得有必要了解下soap webservice,具體的概念網(wǎng)上可以找到很多資料,但網(wǎng)上資料概念性較強,而且soap協(xié)議使用的是xml進行通信,相信xml里面一個namespace就能嚇跑一大堆人,所以這里不討論具體的soap協(xié)議細節(jié),我想通過一個例子來說明什么是soap webservice,通過該例子,你能了解soap webservice其運作原理,當然如果你覺得你對這個已經(jīng)很了解了,大可跳過本章節(jié),本章節(jié)跟后面的內(nèi)容沒有任何關(guān)系。
假設(shè)我們開發(fā)了一個web接口,想給別人用,我們要怎么辦?
? ? 1.部署接口到服務(wù)器?? ?
? ? 2.編寫接口文檔,寫清楚接口是通過什么方法調(diào)的,輸入?yún)?shù)是什么,輸出參數(shù)是什么,錯誤時返回什么。?
? ? 那問題來了,我們能不能只把接口部署到服務(wù)器上,然后接口不單能提供具體的服務(wù),而且還能自動生成一份標準的接口文檔,把接口信息都記錄在該文檔里,如果能做到,是不是能做到"接口即文檔"的目的。??
? ? 那么一個接口的信息包括哪些呢?
?? ? 1.接口地址?? ?
?? ? 2.接口調(diào)用方法?? ?
?? ? 3.接口輸入?yún)?shù)?? ?
?? ? 4.接口輸出參數(shù)?? ?
?? ? 5.接口出錯返回信息?? ?
?? ? 6.....?
soap webservice里wsdl文件就是接口描述信息。核心的信息就是以上幾個。
第二個問題,由于Web service是一個平臺獨立,也就是說,使用接口的人不知道這個service是用什么技術(shù)開發(fā)的,可能是php可能是java等,但接口的參數(shù)和返回的數(shù)據(jù)都是一樣的,要達到這種目的,就需要兩個東西,一個是跟平臺無關(guān)的數(shù)據(jù)格式,soap使用的是xml,一個是通信協(xié)議,也就是soap協(xié)議。?
下面就介紹如何不使用任何框架,僅通過servlet實現(xiàn)一個webservice。該webservice功能很簡單,就是通過一個人的姓名查詢這個人的詳細信息。
?ps:servlet是java web的基礎(chǔ),理解servlet對理解整個java web非常重要,沒寫過servlet就開始用各種框架寫接口就是在胡鬧。
?1. wsdl文件?
準備以下wsdl文件,不要管這個文件是怎么來的,是怎么生成的,我們這次只講原理,不談細節(jié),總之,你根據(jù)需求寫出了這個wsdl文件。
soap:address location里面端口號需要修改為servlet運行的端口號。??
從以下xml片段可以看出
? ?
接口名稱是EmployeeDetail(wsdl:operation)?? ?
接口輸入?yún)?shù)是EmployeeDetailRequest(wsdl:input)?? ?
接口輸出參數(shù)是EmployeeDetailResponse(wsdl:output)?? ?
接口地址是http://localhost:8081/ws-servlet/ws/employee-detail(soap:address)
是不是很簡單,是的,為了簡單,我直接將wsdl文件用變量存儲,我們還需要配置下web.xml
web.xml
這樣我們訪問http://localhost:8080/ws/employee就能返回一個wsdl文件,也就是接口描述文件。在wsdl文件里,我們定義接口地址為http://localhost:8080/ws/employee-detail,接下來我們就要實現(xiàn)這個接口。??
業(yè)務(wù)servlet
這里不做任何業(yè)務(wù)處理,不做xml轉(zhuǎn)bean,不做bean轉(zhuǎn)xml,就是這么暴力,直接返回xml,但他仍是一個soap服務(wù),支持所有soap工具調(diào)用。?
將servlet配置到web.xml里
web.xml
這個地址必須和wsdl文件里定義的保持一致,不然服務(wù)無法被找到。?
測試?
使用soapui測試我們的webservice,通過地址http://localhost:8081/ws-servlet/ws/employee導入wsdl文件,測試接口,返回我們在業(yè)務(wù)servlet里面寫死的內(nèi)容。恭喜你,你已經(jīng)不依賴任何第三方包完成了一個soap webservice。?
當然這個只是一個玩具,但框架就是在上面的基礎(chǔ)上進行擴展,增加wsdl文件自動生成,xml轉(zhuǎn)java,java轉(zhuǎn)xml,xml校驗,錯誤處理等功能,如果你有時間,你也可以寫一個soap webservice框架。??
代碼已經(jīng)上傳至github,歡迎star,開始進入正題,偏的有點遠。??
spring boot開發(fā)soap webservice?
創(chuàng)建spring boot工程?
你可以通過spring initializr初始化spring boot工程,也可以通過inte idea的spring initializr插件進行初始化,個人推薦后面這種。??
添加依賴?
添加soap webservice相關(guān)依賴包和插件,??
pom.xml
插件jaxb2能夠?qū)崿F(xiàn)java和xml之間互轉(zhuǎn),下面是幾個參數(shù)的說明?
? ? schemaDirectory:xsd文件目錄?? ?
? ? schemaFiles:指定schemaDirectory下的xsd文件,多個用逗號隔開,必須指定? schemaDirectory?? ?
? ? outputDirectory:生成java文件保存目錄?? ?
? ? packageName:生成java文件包路徑?? ?
? ? clearOutputDir:重新生成前是否需要清空目錄?
? ?
編寫xsd文件?假設(shè)我們的需求是通過員工工號查詢員工詳細信息,根據(jù)需求編寫以下xsd文件,并保存在/src/main/resources/目錄下。??
employee.xsd
生成java類型文件?
我們需要根據(jù)xsd文件生成java類型文件,這就要借助maven插件jaxb2,打開終端運行命令mvn jaxb2:xjc,如果運行正常,就會在目錄com.definesys.tutorial.ws.type下生成一堆java文件,此時文件結(jié)構(gòu)如下:
創(chuàng)建配置文件?
WebserviceConfig.java
創(chuàng)建業(yè)務(wù)服務(wù)?
EmployeeSoapController.java
與RestController不一樣的是,spring boot soap是根據(jù)請求報文來指定調(diào)用的函數(shù),RestController是根據(jù)請求路徑來確定。@PayloadRoot就是關(guān)鍵,如本次請求報文如下:
xmlns:emp="http://www.definesys.com/xml/employee"就是@PayloadRoot.namespace,emp:EmployeeDetailRequest對應(yīng)@PayloadRoot.localPart。理解了這個其他都很好理解。
測試?
使用soapui進行測試,通過地址http://localhost:8080/ws/employee.wsdl導入wsdl文件進行測試。?
輸入報文
輸出報文
同時提供soap和restful兩種服務(wù)?
soap一般在企業(yè)內(nèi)部用的比較多,做系統(tǒng)間的集成,restful一般用于移動應(yīng)用和h5應(yīng)用,如果在企業(yè)應(yīng)用開發(fā)里能夠同時提供兩種協(xié)議的支持,將極大提高接口的復(fù)用。其實也沒有想象中的那么復(fù)雜,在本例中,只需把業(yè)務(wù)邏輯部分用service實現(xiàn)再創(chuàng)建一個RestController即可,通過設(shè)計模式即可解決,不需要引入新的技術(shù)。
EmployeeService.java
EmployeeSoapController.java
EmployeeRestController.java
測試
這樣就實現(xiàn)了soap和rest同時提供的目的。本人創(chuàng)業(yè)團隊產(chǎn)品MadPecker,主要做BUG管理、測試管理、應(yīng)用分發(fā)
網(wǎng)址:www.madpecker.com,有需要的朋友歡迎試用、體驗!
本文為MadPecker團隊技術(shù)人員編寫,轉(zhuǎn)載請標明出處
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/77818.html
摘要:它使用方式,接收和響應(yīng)外部系統(tǒng)的某種請求。回顧我們在學習基礎(chǔ)網(wǎng)絡(luò)編程章節(jié)已經(jīng)知道了這么一個連接了。使用指定名稱的命名空間。名詞簡單對象訪問協(xié)議作為一個基于語言的協(xié)議用于有網(wǎng)上傳輸數(shù)據(jù)。以的根元素出現(xiàn)。代理這么一個概念就更加清晰了。 WebService介紹 首先我們來談一下為什么需要學習webService這樣的一個技術(shù)吧.... 問題一 如果我們的網(wǎng)站需要提供一個天氣預(yù)報這樣一個需求...
摘要:把上一篇文章生成的文件另存為,放到下面,沒有改,文件也沒有修改,只有配置文件改成了下面這個樣子按照文檔說明,此時訪問就可以訪問了。 在文章中,我學習了spring-ws基本的知識,在文章最后我也實現(xiàn)一個簡單的項目,訪問可以看到wsdl文件,但是我也遇到了一個問題,無法通過soap UI的測試,經(jīng)過這一段業(yè)余時間的學習,這個問題解決。 這是上一個學習創(chuàng)建的項目的demo演示鏈接,打開可以...
摘要:,將類或枚舉類型映射到模式類型,控制字段或?qū)傩缘男蛄谢?。表示將自動綁定類中的每個非靜態(tài)的非瞬態(tài)的由標注字段到。,對于數(shù)組或集合即包含多個元素的成員變量,生成一個包裝該數(shù)組或集合的元素稱為包裝器。 在經(jīng)過前面兩篇文章的學習,我已經(jīng)能夠熟練創(chuàng)建一個正常運行的spring-ws的webservice服務(wù),大多數(shù)接口,都是要有返回數(shù)據(jù),所以這篇文章就是學習spring-ws怎么實現(xiàn)返回數(shù)據(jù) 實...
摘要:我們再使用這樣的來查看這個服務(wù)具體的定義這個用以通過查看服務(wù)也就是我們開頭所說的用通用格式來描述的功能入?yún)⒑头祷刂担刮覀兊恼{(diào)用者明白服務(wù)的使用方法具體詳情可以查看我們的這個服務(wù)的頁面。 WebService是什么呢?顧名思義,是Web系統(tǒng)提供的服務(wù),其目的呢,往大了說:是系統(tǒng)實現(xiàn)多異構(gòu)模塊協(xié)同合作,服務(wù)實現(xiàn)SOA(Services oriented Architecture面向服務(wù)的...
摘要:對于與而言,則可以看做是消息傳遞技術(shù)的一種衍生或封裝。在生產(chǎn)者通知消費者時,傳遞的往往是消息或事件,而非生產(chǎn)者自身。通過消息路由,我們可以配置路由規(guī)則指定消息傳遞的路徑,以及指定具體的消費者消費對應(yīng)的生產(chǎn)者。采用和來進行遠程對象的通訊。 消息模式 歸根結(jié)底,企業(yè)應(yīng)用系統(tǒng)就是對數(shù)據(jù)的處理,而對于一個擁有多個子系統(tǒng)的企業(yè)應(yīng)用系統(tǒng)而言,它的基礎(chǔ)支撐無疑就是對消息的處理。與對象不同,消息本質(zhì)上...
閱讀 3178·2021-11-23 09:51
閱讀 689·2021-10-14 09:43
閱讀 3215·2021-09-06 15:00
閱讀 2412·2019-08-30 15:54
閱讀 2567·2019-08-30 13:58
閱讀 1857·2019-08-29 13:18
閱讀 1384·2019-08-27 10:58
閱讀 521·2019-08-27 10:53