前言
前兩天播揪,室友給我發(fā)了一套代碼......
一段對話下來,我心中多個疑問:SOAP是什么筒狠?node調(diào)用java接口猪狈?
一向懶散的我,不知為何卻對些問題有點興趣辩恼,平常我們處理不同應用程序之間的通訊雇庙,都是以RESTful API的方式的谓形,基于HTTP協(xié)議,互相傳輸JSON格式的數(shù)據(jù)以達到程序間的交流〗埃現(xiàn)在卻有一個稱SOAP的東東寒跳,可以直接調(diào)用程序的接口?
SOAP竹椒,何方妖孽童太?
- SOAP(Simple Object Access Protocol 簡單對象訪問協(xié)議)
- SOAP 是基于 XML 的簡易協(xié)議,可使應用程序在 HTTP 之上進行信息交換胸完。
- SOAP 獨立于平臺书释、語言,且簡單和可擴展
SOAP 怎么來的赊窥?
此標準由IBM爆惧、Microsoft、UserLand和DevelopMentor在1998年共同提出锨能,并得到IBM扯再,蓮花(Lotus),康柏(Compaq)等公司的支持腹侣,于2000年提交給萬維網(wǎng)聯(lián)盟(World Wide Web Consortium叔收;W3C),目前SOAP 1.1版是業(yè)界共同的標準傲隶,屬于第二代的XML協(xié)定(第一代具主要代表性的技術(shù)為XML-RPC以及WDDX)饺律。
SOAP 的 好搭檔:WSDL、Web Service
為了能了解SOAP的做的事跺株,你首先需要了解和SOAP一同工作的兩個同事复濒。
Web Service 是一套應用程序的組件,也可以說是對外接口乒省,它使用SOAP這一套標準巧颈,提供公共服務給別的程序調(diào)用。
WSDL 是基于XML語言的袖扛,用來描述web service的消息格式和協(xié)議細節(jié)砸泛,以及如何訪問它們。它的全稱是:Web Service Description Language web服務描述語言蛆封。
SOAP是怎么工作的唇礁?
在了解了SOAP、WSDL惨篱、Web Service的定義之后盏筐,我們就來窺探一下它們?nèi)齻€是怎么P的?
假設現(xiàn)在有兩個應用程序砸讳,分別用兩種語言進行開發(fā)的琢融,一個是用nodejs開發(fā)的程序界牡,一個是用java開發(fā)的程序。而java程序其中有一個方法(getUser)可以查詢數(shù)據(jù)庫中的某用戶的信息漾抬。那么在nodejs程序請求java程序的(getUser)方法獲取某用戶信息的流程是怎么走的宿亡?
我在應用程序的層面上解釋一下這個流程,
請看下圖奋蔚,然后我再對每一個步驟說明:
首先java程序會把getUser()
做成Web Service她混,然后要提供對這個service的描述文檔,那便是WSDL文件泊碑。nodejs程序要調(diào)用的方法以及參數(shù)的信息都存放在遵循了SOAP標準的WSDL文件中坤按,所以要訪問遠端的web service,必須先獲得對方提供的WSDL馒过。
步驟一:nodejs程序通過http請求臭脓,獲取到java程序提供的WSDL文件。nodejs程序得到這個WSDL文件之后腹忽,就會對它進行解析来累,得知java程序提供了getUser()
,而且也知道這個方法需要的參數(shù)是string
類型的且變量名userUUID
窘奏。
步驟二:在nodejs程序知道java程序有getUser()
這個方法之后嘹锁,它通過http請求,發(fā)送SOAP信息到java程序着裹,java程序得到這個SOAP信息之后领猾,進行解析,知道了nodejs程序需要請求getUser()
方法骇扇,且提供了所需要的參數(shù)摔竿。
步驟三:java程序?qū)odejs的請求進行邏輯處理,查詢數(shù)據(jù)庫少孝,然后把結(jié)果翻譯成SOAP信息继低,再通過http協(xié)議發(fā)送到nodejs程序。
本例中稍走,nodejs程序和java程序溝通的SOAP實例:
SOAP 請求:
POST /InStock HTTP/1.1
Host: www.example.org
Content-Type: application/soap+xml; charset=utf-8
Content-Length: nnn
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
<soap:Body xmlns:m="http://www.example.org/stock">
<m:getUser>
<m:userUUID>123456789</m:userUUID>
</m:getUser>
</soap:Body>
</soap:Envelope>
SOAP 響應:
HTTP/1.1 200 OK
Content-Type: application/soap+xml; charset=utf-8
Content-Length: nnn
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
<soap:Body xmlns:m="http://www.example.org/stock">
<m:getUserResponse>
<m:userName>JerryC</m:userName>
</m:getUserResponse>
</soap:Body>
</soap:Envelope>
綜上袁翁,程序之間的調(diào)用,無論進行請求還是返回結(jié)果婿脸,每一次都需要構(gòu)造一則SOAP信息粱胜,固然SOAP便是程序之間溝通的語言。
node開發(fā)中的soap
我是一名nodejs開發(fā)者盖淡,知道有這么一種程序之間交流信息的協(xié)議之后年柠,很自然就想知道用nodejs怎么使用這個協(xié)議凿歼。
nodejs針對SOAP也有不少的第三方模塊:
其中褪迟,node-soap是最受歡迎的(根據(jù)github上star數(shù)量)冗恨,也是我最喜歡的。
本文寫作參考:
http://www.w3school.com.cn/soap/index.asp
http://zh.wikipedia.org/wiki/SOAP
如果本文對您有用
請不要吝嗇你們的Follow與Start
這會大大支持我們繼續(xù)創(chuàng)作
「Github」
MZMonster :@MZMonster
JC_Huang :@JerryC8080