57 views

基于SOAP的Web服务调用原理

By | 2019年8月8日

SOAP的概念不应该新鲜事物了。简单地说,SOAP是一种标准,它将XML中的数据结合起来,并通过HTTP协议(或其他协议,但通常是HTTP协议)与远程服务进行通信。它还可以被看作是一个中间件,并作为通信的桥梁。因为当所有服务使用相同的标准时,通信就更容易了。

当然,我们必须承认SOAP格式的消息内容是多余的,并且依赖于定义良好的XML模式。手工创建SOAP消息非常复杂,需要一些工具来简化工作。因此,越来越多的Web服务倾向于使用RESTful风格的Web服务。

在ASP.NET中,向导创建的Web服务是SOAP样式。假设我们创建一个Web服务。使用向导,完成以下代码:

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文件及其SOAP消息格式可以通过Web服务的WSDL获得。这两个函数使用SOAPUI输入指定的WSDL文件,该文件可以自动生成SOAP消息格式。

clipboard[26]

注:在ASP中。NET,您可以通过访问WebService1来获取WSDL文件。asmx和输入查询字符串?WSDL,也就是说,通过输入WebService1。ASMX?在IE浏览器中?

还需要注意的是,由Microsoft生成的WSDL文件有两个绑定,即SOAP1.1和SOAP1.2,它们都支持这两个绑定。

clipboard[27]

因此在SoapUI中可以看到2个不同的WebService接口,其实是大同小异的。

clipboard[28]

双击请求添加获取SOAP消息格式,其中问号可以输入指定的值,然后单击执行按钮获取SOAP消息格式的响应。

clipboard[29]

通过soapui生成SOAP消息后,我们可以构建SOAP消息来自己调用SOAP样式的Web服务。因此,只要我们解决如何生成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消息发布到Web服务器并获取返回消息,这也是一个基于XML的文本。

通过上面的示例,我们可以通过编写特殊工具来生成SOAP消息。封装后,我们可以通过post(如c中的httpwebrequest)实现对web服务器财富的调用。

本文编辑于2019年08月8日,属于云漫网络原创内容,由特约作者(CDN行业资深从事人)首发在win-man.com,云漫网络每日更新发布行业原创内容,转载请注明出处。否则属侵权行为一定追究责任。

本文转载于:http://win-man.com
本文关键词:高防CDN,加速CDN,视频CDN,图片CDN
作者:CDN行业资深从事人

发表评论

电子邮件地址不会被公开。 必填项已用*标注