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