基於SOAP的WebService的調用原理

版權聲明: 本文由 一隻博客 發表於 bloghome博客javascript

文章連接: https://www.bloghome.com.cn/user/cnn237111java

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消息格式。瀏覽器

clipboard[26]

注意:在ASP.net中,能夠經過訪問WebService1.asmx而且輸入查詢字符串?WSDL,即在IE瀏覽器中輸入WebService1.asmx?wsdl就能夠得到WSDL文件。服務器

還有一點要注意的是,微軟生成的WSDL文件,有2個binding,分別表示soap1.1和soap1.2,它都支持。框架

clipboard[27]

所以在SoapUI中能夠看到2個不一樣的WebService接口,實際上是大同小異的。ide

clipboard[28]

雙擊Add的Request,就能夠獲得SOAP消息格式了,其中的問號能夠輸入指定的值,而後點擊執行按鈕,就又能夠獲得響應的SOAP消息格式了。

clipboard[29]

經過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的調用。

相關文章
相關標籤/搜索