介紹
spring boot web模塊提供了RestController實現restful,第一次看到這個名字的時候覺得還有SoapController,很惋惜沒有,對於soap webservice提供了另一個模塊spring-boot-starter-web-services支持。本文介紹如何在spring boot中開發soap webservice接口,以及接口如何同時支持soap和restful兩種協議。
soap webservice
Web service是一個平臺獨立的,低耦合的,自包含的、基於可編程的web的應用程序,既能夠是soap webservice也能夠是restwebservice,在rest還沒出來以前,咱們說webservice通常是指基於soap協議進行通訊的web應用程序。
在開始以前,我以爲有必要了解下soap webservice,具體的概念網上能夠找到不少資料,但網上資料概念性較強,並且soap協議使用的是xml進行通訊,相信xml裏面一個namespace就能嚇跑一大堆人,因此這裏不討論具體的soap協議細節,我想經過一個例子來講明什麼是soap webservice,經過該例子,你能瞭解soap webservice其運做原理,固然若是你以爲你對這個已經很瞭解了,大可跳過本章節,本章節跟後面的內容沒有任何關係。
假設咱們開發了一個web接口,想給別人用,咱們要怎麼辦
1.部署接口到服務器
2.編寫接口文檔,寫清楚接口是經過什麼方法調的,輸入參數是什麼,輸出參數是什麼,錯誤時返回什麼。
那問題來了,咱們能不能只把接口部署到服務器上,而後接口不單能提供具體的服務,並且還能自動生成一份標準的接口文檔,把接口信息都記錄在該文檔裏,若是能作到,是否是能作到"接口即文檔"的目的。
那麼一個接口的信息包括哪些呢?
1.接口地址
2.接口調用方法
3.接口輸入參數
4.接口輸出參數
5.接口出錯返回信息
6.....
soap webservice裏wsdl文件就是接口描述信息。核心的信息就是以上幾個。
第二個問題,因爲Web service是一個平臺獨立,也就是說,使用接口的人不知道這個service是用什麼技術開發的,多是php多是java等,但接口的參數和返回的數據都是同樣的,要達到這種目的,就須要兩個東西,一個是跟平臺無關的數據格式,soap使用的是xml,一個是通訊協議,也就是soap協議。
下面就介紹如何不使用任何框架,僅經過servlet實現一個webservice。該webservice功能很簡單,就是經過一我的的姓名查詢這我的的詳細信息。
ps:servlet是java web的基礎,理解servlet對理解整個java web很是重要,沒寫過servlet就開始用各類框架寫接口就是在胡鬧。php
1. wsdl文件 java
準備如下wsdl文件,不要管這個文件是怎麼來的,是怎麼生成的,咱們此次只講原理,不談細節,總之,你根據需求寫出了這個wsdl文件。
git
soap:address location裏面端口號須要修改成servlet運行的端口號。
從如下xml片斷能夠看出
接口名稱是EmployeeDetail(wsdl:operation)
接口輸入參數是EmployeeDetailRequest(wsdl:input)
接口輸出參數是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,接下來咱們就要實現這個接口。 github
這裏不作任何業務處理,不作xml轉bean,不作bean轉xml,就是這麼暴力,直接返回xml,但他還是一個soap服務,支持全部soap工具調用。 web
將servlet配置到web.xml裏spring
web.xml
編程
這個地址必須和wsdl文件裏定義的保持一致,否則服務沒法被找到。 設計模式
使用soapui測試咱們的webservice,經過地址http://localhost:8081/ws-servlet/ws/employee導入wsdl文件,測試接口,返回咱們在業務servlet裏面寫死的內容。恭喜你,你已經不依賴任何第三方包完成了一個soap webservice。 服務器
固然這個只是一個玩具,但框架就是在上面的基礎上進行擴展,增長wsdl文件自動生成,xml轉java,java轉xml,xml校驗,錯誤處理等功能,若是你有時間,你也能夠寫一個soap webservice框架。 restful
代碼已經上傳至github,歡迎star,開始進入正題,偏的有點遠。
spring boot開發soap webservice
你能夠經過spring initializr初始化spring boot工程,也能夠經過inte idea的spring initializr插件進行初始化,我的推薦後面這種。
添加soap webservice相關依賴包和插件,
pom.xml
插件jaxb2可以實現java和xml之間互轉,下面是幾個參數的說明
schemaDirectory:xsd文件目錄
schemaFiles:指定schemaDirectory下的xsd文件,多個用逗號隔開,必須指定 schemaDirectory
outputDirectory:生成java文件保存目錄
packageName:生成java文件包路徑
clearOutputDir:從新生成前是否須要清空目錄
employee.xsd
咱們須要根據xsd文件生成java類型文件,這就要藉助maven插件jaxb2,打開終端運行命令mvn jaxb2:xjc,若是運行正常,就會在目錄com.definesys.tutorial.ws.type下生成一堆java文件,此時文件結構以下:
WebserviceConfig.java
EmployeeSoapController.java
與RestController不同的是,spring boot soap是根據請求報文來指定調用的函數,RestController是根據請求路徑來肯定。@PayloadRoot就是關鍵,如本次請求報文以下:
xmlns:emp="http://www.definesys.com/xml/employee"就是@PayloadRoot.namespace,emp:EmployeeDetailRequest對應@PayloadRoot.localPart。理解了這個其餘都很好理解。
使用soapui進行測試,經過地址http://localhost:8080/ws/employee.wsdl導入wsdl文件進行測試。
輸入報文
輸出報文
同時提供soap和restful兩種服務
soap通常在企業內部用的比較多,作系統間的集成,restful通常用於移動應用和h5應用,若是在企業應用開發裏可以同時提供兩種協議的支持,將極大提升接口的複用。其實也沒有想象中的那麼複雜,在本例中,只需把業務邏輯部分用service實現再建立一個RestController便可,經過設計模式便可解決,不須要引入新的技術。
EmployeeService.java
EmployeeSoapController.java
EmployeeRestController.java
測試
這樣就實現了soap和rest同時提供的目的。本人創業團隊產品MadPecker,主要作BUG管理、測試管理、應用分發網址:www.madpecker.com,有須要的朋友歡迎試用、體驗!本文爲MadPecker團隊技術人員編寫,轉載請標明出處