(转)基于SOAP的WebService的调用原理

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服务。使用向导,完成如下的代码:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

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消息格式。生成并补充数据,得到如下的格式


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

<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实现。

代码如下:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

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

本文出自 “一只博客” 博客,请务必保留此出处http://cnn237111.blog.51cto.com/2359144/1357029

时间: 2024-08-05 00:08:40

(转)基于SOAP的WebService的调用原理的相关文章

python发布及调用基于SOAP的webservice

现如今面向服务(SOA)的架构设计已经成为主流,把公用的服务打包成一个个webservice供各方调用是一种非常常用的做法,而应用最广泛的则是基于SOAP协议和wsdl的webservice.本文讲解python环境下如何发布及调用一个基于SOAP的webservice,基于soaplib(发布)和suds(调用). OS:ubuntu 14.04  python:2.7.6 服务端: 1.安装: 服务端要使用的工具包是soaplib,遗憾的是现在也停止维护了,不过好在还能用,下载地址在http

关于JavaScript 访问基于SOAP的WebService跨域问题

关于JavaScript 访问基于SOAP的WebService跨域问题 最近,搭建好了一个基于SOAP的WebService服务器.结果,使用JavaScript访问WebService遇到了跨域的问题! 首先,声明代码中的WebService不是本人搭建,由于本人的服务器地址不方便公开. 这个是测试HTML <html> <meta charset="utf-8" /> <head> <title>通过ajax调用WebService

Android与服务器端数据交互(基于SOAP协议整合android+webservice)

此文出自:http://www.cnblogs.com/zhangdongzi/archive/2011/04/19/2020688.html 上一节中我们通过http协议,采用HttpClient向服务器端action请求数据.当然调用服务器端方法获取数据并不止这一种.WebService也可以为我们提供所需数据, 那么什么是webService呢?,它是一种基于SAOP协议的远程调用标准,通过webservice可以将不同操作系统平台,不同语言,不同技术整合到一起. 我们在PC机器java客

android客户端与服务器交互数据(基于SAOP协议的远程调用标准,通过webservice可以将不同操作系统平台,不同语言,不同技术整合)

在PC机器java客户端中,需要一些库,比如XFire,Axis2,CXF等等来支持访问WebService,但是这些库并不适合我们资源有限的android手机客户端,做过JAVA ME的人都知道有KSOAP这个第三方的类库,可以帮助我们获取服务器端webService调用,当然KSOAP已经提供了基于android版本的jar包 首先下载KSOAP包:ksoap2-android-assembly-2.5.2-jar-with-dependencies.jar包 然后新建android项目 以

webservice的工作原理

Web service 的基本概念 Web service 也叫XML Web Servuce WebService是一种可以接受从Internet或者Intranet上的其他系统中传递过来的请求,轻量级的独立的通讯技术.是通过SOAP在web上提供的软件服务,使用WSDL文件进行说明,并通过UDDI进行注册. XML:(Extensible Markup Language)扩展性可标记语言,面向短期的临时数据处理,面向万维网路,是SOAP的基础. SOAP:(Simple Object Acc

WebService 之 工作原理

Web Service基本概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术.是:通过SOAP在Web上提供的软件服务,使用WSDL文件进行说明,并通过UDDI进行注册. XML:(Extensible Markup Language)扩展型可标记语言.面向短期的临时数据处理.面向万维网络,是Soap的基础. Soap:(Simple Object Acces

WebService CXF调用方式《三》

问题?WebService CXF调用方式<三>,CXF工作原理和调用方式 一.CXF是什么? Apache CXF是一个开源的,全功能的,容易使用的Web服务框架.CXF是两个项目的结合:由IONA技术公司(现在是Progress的一部分)开发的Celtix和由Codehaus主持的团队开发的XFire,合并是由人们在在Apache软件基金会共同完成的.CXF的名字来源于"Celtix"和"XFire"的首字母. 二.CXF有什么作用? Apache

构建基于CXF的WebService服务(3)-- 利用拦截器实现权限验证

CXF中的拦截器分为in拦截器和out拦截器,又有客户端拦截器和服务端拦截器. 拦截器使用流程:客户端(out)-> 服务端(in)->处理业务->服务端(out)->客户端(in),并不是每一步都需要拦截器.在这里我们用到的是客户端Out拦截器和服务端in拦截器.服务端in拦截器检查用户级权限,客户端out浏览器发送用户信息给服务端. 1.创建服务端验证 JaxWsServerFactoryBean或Endpoint都可以通过getInInterceptors方法,向WebSer

浅谈WebService的调用&lt;转&gt;

0.前言 前段时间,公司和电信有个合作,产品对接电信的某个平台,使用了WebService接口的调用,实现了业务受理以及单点登录.终于使用到了WebService,楼主还是比较兴奋的,目前功能已经上线,下面进行使用总结.WebService涉及到内容还是比较多的,涉及到发布和调用,有不少知识点,本文只是最简单的调用. 1.WebService简介 WebService是基于soap协议(简单对象访问协议全写为Simple Object Access Protocol)的,所有的webServic