SOAP
Web Service 與 SOAP 大概的模樣
假設請求者知道網路上有個 Web Service,它的 getString(x,y) 函式會回傳字串,所以現在要呼叫 getString('ABC','123') 看看,於是發送如下的 SOAP 過去:
接收者收到上面的 SOAP 後,經過 XML 的剖析,得知函式名稱為 getString,參數為 x 和 y,引數分別為 ABC 和 123,於是執行了做為 Web Service 服務的如下程式:
並且將結果以如下 SOAP 回傳給請求者:
請求者也從收到的 SOAP 剖析資料,得到 ABC123,這樣就完成一個 Web Service 的服務。
SOAP 還可以更複雜,使用 Namespace 和 XSI 讓訊息更清楚。
SOAP 1.1 和 1.2
SOAP 1.1 在標頭的 Content-Type 為 text/xml,SOAP 1.2 為 application/soap+xml,且不在標頭設定 SOAPAction。
SOAP 1.1 的 envolope 命名空間為 http://schemas.xmlsoap.org/soap/envelope/,SOAP 1.2 為 http://www.w3.org/2003/05/soap-envelope。
Web Service 的定義
並不是兩端程式使用 SOAP 進行溝通,就叫做 Web Service,一定要在網路傳遞 SOAP,才符合 Web Service 的定義。
所以在單機硬碟裡讓 Python 和 Ruby 雙方把 SOAP 寫在 XML 檔案相互讀取、剖析、執行,是稱不上 Web Service 的。且制定 Web Service 標準的組織也說,這樣做並沒有意義,單機有單機調用程式的標準了,Web Service 不是為了這用途而定義、也不應該做為這用途的標準。
透過網路連線讓程式溝通(SOAP),才能進一步讓主機主動提供服務(WSDL + UDDI),才是 Web Service 真正想做的事。而在單機上不透過網路連線,就拿 SOAP 做為程式雙方溝通的標準,依目前程式語言的使用情況來說,通常都會設計成被動接受請求,不會設計為主動提供服務。
或許 Node.js 或 Go 會改變情況,但這類程式語言興盛起來、需求浮現時,自然會有新的標準方案。所謂制定標準化,就是對浮現出來的需求統一定義、進行規範,在需求沒出來之前,是不能標準化的,因為那叫空談。制定 Web Service 標準時,浮現的需求就是用網路呼叫遠端的程式,打破平台與語言的隔閡。如果有新的做法可以打破平台與語言的隔閡,會有新的標準方案出來,並且取代 Web Service,進入新的時代。