原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://cnn237111.blog.51cto.com/2359144/1357029

SOAP的概念应该不是什么新鲜事物了。简单的说,SOAP是以把数据以XML的方式组合起来,然后通过HTTP协议(也可以是其它协议,但是通常总是用http协议)和远程服务进行通信的一个标准,也可以把它认为是一个中间件,起着沟通桥梁的作用。因为当所有的服务都使用同一种标准,那么沟通就比较容易了。

当然不得不承认,SOAP格式的报文内容冗余,并且依赖于定义好的XML schemas,对于手工创建SOAP报文十分复杂,需要借助一些工具来简化工作。因此越来越多的Web服务倾向于使用Restful风格的WebService。

根据SOAP的协议,只需要发送有效的SOAP消息到服务端,就能实现通信。那么如何生成有效的SOAP消息?SOAP官方文档详细说明了SOAP的格式,但官方文档很长,一般人没耐心去读完,大多时候仅仅在需要的时候去查一下,也可以去http://w3school.com.cn/soap/soap_syntax.asp学习一下简化版的。这里介绍一个工具,SoapUI,可以去它官网http://www.soapui.org/下载,它可以通过WSDL生成请求的SOAP消息格式。

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文件中,通过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接口,其实是大同小异的。

双击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的调用。

soap webservice的更多相关文章

  1. SOAP Webservice和RESTful Webservice

    http://blog.sina.com.cn/s/blog_493a845501012566.html REST是一种架构风格,其核心是面向资源,REST专门针对网络应用设计和开发方式,以降低开发的 ...

  2. 随便聊聊 SOA & SOAP & WebService 的一些东西,以及客户端开发的代码逻辑解析

    http://blog.csdn.net/hikaliv/article/details/6459779 一天的时间调通了一个 WebService 的 Java 端的 C/S.一个 Android  ...

  3. Restful是什么,SOAP Webservice和RESTful Webservice

    首先,应该怀着这样一种心态来学习Restful——Restful你可以将其理解一种软件架构风格,并且诠释了Http协议的设计初衷,所以不要把他理解的那么神秘,Restful风格有好处,当然也是有坏处的 ...

  4. REST & SOAP webservice 小结

    REST: REST是一种架构设计,特点是面向资源,存在于互联网的任何事物都可以理解为资源,REST相比较SOAP WS具有比较低的开发门槛. 1. 网络上的事物被抽象成资源,每个资源对应唯一的资源标 ...

  5. Web Service进阶(七)浅谈SOAP Webservice和RESTful Webservice

    浅谈SOAP Webservice和RESTful Webservice REST是一种架构风格,其核心是面向资源,REST专门针对网络应用设计和开发方式,以降低开发的复杂性,提高系统的可伸缩性.RE ...

  6. Spring Boot SOAP Webservice例子

    前言 本文将学习如何利用Spring boot快速创建SOAP webservice服务: 虽然目前REST和微服务越来越流行,但是SOAP在某些情况下,仍然有它的用武之地: 在本篇 spring b ...

  7. PHP中调用Soap/WebService

    关于在PHP中如何调用Soap/WebService的描述,网络上有不少帖子.但是主要讲述了如何用PHP开发服务器端.客户端并加以关联,而很少触及在PHP中调用现成的WebService的情况.在本文 ...

  8. REST WebService与SOAP WebService的比较

    在SOA的基础技术实现方式中WebService占据了很重要的地位,通常我们提到WebService第一想法就是SOAP消息在各种传输协议上交互.近几年REST的思想伴随着SOA逐渐被大家接受,同时各 ...

  9. httpclient妙用一 httpclient作为客户端调用soap webservice(转)

    前面有一篇使用HttpClient调用带参数的post接口方法,这里找到一篇使用HttpClient调用Soap协议接口的方式. 原文地址:httpclient妙用一 httpclient作为客户端调 ...

  10. Eclipse + Apache Axis2 发布SOAP WebService(三)第一个程序Hello Axis2 SOAP!

    因为Axis2同时支持SOAP和RESTful的WebService开发. 我的目标主要是RESTful,这里简单记录一个SOAP的小例子: 原文地址:https://jingyan.baidu.co ...

随机推荐

  1. bootstrap 中dropmenu不起作用

    今天在使用bootstrap发现dropmenu一直不起作用,代码是从官网拷贝过来. 网上查找可以用的页面进行一点点的去除分析,发现竟然是顺序反了导致的. 在使用dropmenu时需要引入jquery ...

  2. ACM程序设计选修课——Problem E:(ds:图)公路村村通(Prim)

    问题 E: (ds:图)公路村村通 时间限制: 1 Sec  内存限制: 128 MB 提交: 9  解决: 5 题目描述 现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本, ...

  3. BZOJ4816 [Sdoi2017]数字表格 【莫比乌斯反演】

    题目 Doris刚刚学习了fibonacci数列.用f[i]表示数列的第i项,那么 f[0]=0 f[1]=1 f[n]=f[n-1]+f[n-2],n>=2 Doris用老师的超级计算机生成了 ...

  4. cf496D Tennis Game

    Petya and Gena love playing table tennis. A single match is played according to the following rules: ...

  5. 【Tyvj2133&BZOJ1146】网络管理Network(树套树,DFS序,树状数组,主席树,树上差分)

    题意:有一棵N个点的树,每个点有一个点权a[i],要求在线实现以下操作: 1:将X号点的点权修改为Y 2:查询X到Y的路径上第K大的点权 n,q<=80000 a[i]<=10^8 思路: ...

  6. linux 头文件以及库的路径

    原来在编译的时候可以指定执行时去哪里找需要的lib文件,长知识了 本文详细介绍了Linux 下gcc头文件指定方法,以及搜索路径顺序的问题.另外,还总结了,gcc动态链接的方法以及路径指定,同样也讨论 ...

  7. STL之set的用法

    1.关于set 首先,set是关联容器,set作为一个容器是用来存储同一种数据类型的数据结构,基本功能与数组相似.不同的是,在set中每个元素的值都是唯一的.而且系统能够根据元素的值自动进行排序.但是 ...

  8. AC日记——最大子树和 洛谷 P1122

    题目描述 小明对数学饱有兴趣,并且是个勤奋好学的学生,总是在课后留在教室向老师请教一些问题.一天他早晨骑车去上课,路上见到一个老伯正在修剪花花草草,顿时想到了一个有关修剪花卉的问题.于是当日课后,小明 ...

  9. js 去掉以逗号分割的字符串中头尾和中间多余的逗号

    let permission = ",,,106,105,108,,,109,110,107,,101,,," let permission = "106,105,108 ...

  10. 机器学习实战读书笔记(五)Logistic回归

    Logistic回归的一般过程 1.收集数据:采用任意方法收集 2.准备数据:由于需要进行距离计算,因此要求数据类型为数值型.另外,结构化数据格式则最佳 3.分析数据:采用任意方法对数据进行分析 4. ...