版權聲明: 本文由 一隻博客 發表於 bloghome博客javascript
SOAP的概念應該不是什麼新鮮事物了。簡單的說,SOAP是以把數據以XML的方式組合起來,而後經過HTTP協議(也能夠是其它協議,可是一般老是用http協議)和遠程服務進行通訊的一個標準,也能夠把它認爲是一箇中間件,起着溝通橋樑的做用。由於當全部的服務都使用同一種標準,那麼溝通就比較容易了。jquery
固然不得不認可,SOAP格式的報文內容冗餘,而且依賴於定義好的XML schemas,對於手工建立SOAP報文十分複雜,須要藉助一些工具來簡化工做。所以愈來愈多的Web服務傾向於使用Restful風格的WebService。web
根據SOAP的協議,只須要發送有效的SOAP消息到服務端,就能實現通訊。那麼如何生成有效的SOAP消息?SOAP官方文檔詳細說明了SOAP的格式,但官方文檔很長,通常人沒耐心去讀完,大多時候僅僅在須要的時候去查一下,也能夠去http://w3school.com.cn/soap/soap_syntax.asp學習一下簡化版的。這裏介紹一個工具,SoapUI,能夠去它官網http://www.soapui.org/下載,它能夠經過WSDL生成請求的SOAP消息格式。ajax
ASP.NET中,採用嚮導建立的Web服務,是SOAP風格的。假設咱們建立一個web服務。使用嚮導,完成以下的代碼:c#
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Services; namespace WebService1 { /// <summary> /// Summary description for WebService1 /// </summary> [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. // [System.Web.Script.Services.ScriptService] public class WebService1 : System.Web.Services.WebService { [WebMethod] public string HelloWorld() { return "Hello World"; } [WebMethod] public int Add(int a, int b) { return a + b; } /// <summary> /// 把公制單位的汽車轉化成以英制單位表示的汽車 /// </summary> /// <param name="s"></param> /// <returns></returns> [WebMethod] public car ChangeCarUnit(car s) { s.length = s.length * 3.3m; s.width = s.width * 3.3m; s.weight = s.width * 2.2m; return s; } } public class car { public string model = ""; public decimal length = 0; public decimal width = 0; public decimal weight = 0; } }
方法都寫在WebService1.asmx文件中,經過web服務的WSDL,能夠獲得它的SOAP消息格式。這兩採用SoapUI輸入指定的WSDL文件,便可以自動生成SOAP消息格式。瀏覽器
注意:在ASP.net中,能夠經過訪問WebService1.asmx而且輸入查詢字符串?WSDL,即在IE瀏覽器中輸入WebService1.asmx?wsdl就能夠得到WSDL文件。服務器
還有一點要注意的是,微軟生成的WSDL文件,有2個binding,分別表示soap1.1和soap1.2,它都支持。框架
所以在SoapUI中能夠看到2個不一樣的WebService接口,實際上是大同小異的。ide
雙擊Add的Request,就能夠獲得SOAP消息格式了,其中的問號能夠輸入指定的值,而後點擊執行按鈕,就又能夠獲得響應的SOAP消息格式了。
經過SoapUI生成SOAP消息後,就能夠本身構造SOAP消息來調用SOAP風格的WebService,所以,只要解決如何生成請求的SOAP消息,咱們甚至能夠本身實現一個Web服務調用框架,不管是基於PHP,ASP.net,仍是javascript。
-----------------------------------------------------------------------
下面的演示如何在javascript中發送SOAP。
一下代碼調用以前WebService1中的方法ChangeCarUnit,這個方法把汽車參數從公制爲單位的轉換成英制單位。
首先手動經過SoapUI獲取SOAP消息格式。生成並補充數據,獲得以下的格式
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/"> <soapenv:Header/> <soapenv:Body> <tem:ChangeCarUnit> <!--Optional:--> <tem:s> <!--Optional:--> <tem:model>Passat</tem:model> <tem:length>4.87</tem:length> <tem:width>1.834</tem:width> <tem:weight>1435</tem:weight> </tem:s> </tem:ChangeCarUnit> </soapenv:Body> </soapenv:Envelope>
所以只需將這串xml發送到webservice既可。
經過jquery ajax實現。
代碼以下:
<script type="text/javascript"> $(function () { $("#btnclick").click(function () { var soapmessage = ""; soapmessage += '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/">'; soapmessage += '<soapenv:Header/>'; soapmessage += '<soapenv:Body>'; soapmessage += '<tem:ChangeCarUnit>'; soapmessage += ' <!--Optional:-->'; soapmessage += ' <tem:s>'; soapmessage += ' <!--Optional:-->'; soapmessage += ' <tem:model>Passat</tem:model>'; soapmessage += ' <tem:length>4.87</tem:length>'; soapmessage += ' <tem:width>1.834</tem:width>'; soapmessage += ' <tem:weight>1435</tem:weight>'; soapmessage += ' </tem:s>'; soapmessage += '</tem:ChangeCarUnit>'; soapmessage += ' </soapenv:Body>'; soapmessage += '</soapenv:Envelope>'; var option = { url: 'http://localhost:28689/WebService1.asmx', type: 'POST', contentType: 'text/xml', success: function (result) { alert(result.documentElement.textContent); }, data: soapmessage }; $.ajax(option); }); }); </script> <input value='click' type="button" id="btnclick" />
點擊按鈕後,就會將soap消息post到web服務器,而且獲得返回消息,返回消息也是基於XML的文本。
經過上面的實例,咱們能夠經過編寫專用的工具來生成SOAP消息,經過封裝後,再經過POST方式(好比c#中的HttpWebRequest)來實現webserverice的調用。