代码改变世界

python 中关于soap

2017-09-08 17:29  ZN23&24  阅读(2154)  评论(0编辑  收藏  举报

SOAP由来

 

一项新技术的诞生,往往是因为要解决某些问题,或者改良当时的技术的,SOAP是为了解决应用程序跨互联网通信问题的,之前的RPC(远程过程调用)方式虽然也可以解决远程通信问题,但是安全性和兼容性均存在一些问题,这里只说SOAP的这个方案带来的好处:

 

  • 作为协议,W3C统一编程标准
  • 使用HTTP通信,跨互联网
  • 基于XML,独立于任何平台      
  • 可绕过防火墙 

从上面几点可以看出SOAP的最大好处是:由于有W3C的标准支持,当你部署一个服务到公网,在任何地方,任何平台都能以统一的标准解析服务中的标记,并自己生成访问服务的代码,进而使用这个服务。

基于这些优点,在2000年微软,IBM等公司将这套标准形成协议交由著名的W3C,进而才形成了编程领域的统一标准,当然,像这些大型的公司据说有部分员工就是W3C的顾问,国内的软件公司在这方面做的还不够,标准的制定对技术的发展有很大的推动。

 

SOAP标准

 

一个服务公开了自己的SOAP服务接口后,服务使用方是怎么识别出这些内容代表什么意思呢?这就是标准的意义--形成共识,一个SOAP消息的基本结构是

 

<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">

<soap:Header>
  ...
</soap:Header>

<soap:Body>
  ...
  <soap:Fault>
    ...
  </soap:Fault>
</soap:Body>

</soap:Envelope>

 

在之前做的Demo中,一个SOAP消息是这样的:

 

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/%22>
<s:Body>
<GetPersonResponse xmlns="http://tempuri.org/%22>
<GetPersonResult xmlns:a="http://schemas.datacontract.org/2004/07/WCFServiceDemo%22 

 

xmlns:i="http://www.w3.org/2001/XMLSchema-instance%22>
<a:Age>25</a:Age>
<a:Name>LeonWeng</a:Name>
</GetPersonResult>
</GetPersonResponse>
</s:Body>
</s:Envelope>

 

上面其实就是一个XML文件内容,包含了服务中的方法名称和参数等内容,但是这个内容有两个节点是必不可少的:

 

  • Envelope  这个节点标注了SOAP的命名空间,也可以说标准,个人理解是这个地址是指出了此文件的标准制定方
  • Body节点是说明了这个SOAP的调用方法等

 

SOAP消息还有另外两个不太常用的节点

 

  • Header可以在这里加入一些头信息(记得吗?webservice的用户名密码验证)
  • Fault是指在处理SOAP过程中发生的错误信息

 

SOAP消息收发

 

由于SOAP消息是通过HTTP方式发送的,那么一定是在HTTP标准下进行发送接收的,让我们通过Fiddler来观察一下是不是这样

 

 

首先我们向服务端发送一个请求

 

image

 

注意上图中大的矩形中内容其实就是普通的HTTP请求头,而下面跟着的即是我们的SOAP包了,这个数据包中含有

 

  • Post 请求方式
  • Content-Type 内容类型(这里是XML)和编码方式
  • Host 主机
  • Content-Lenth 数据大小

 

当服务端收到这个消息后就会作出相应的处理了,返回给客户端了一个数据包

 

image

 

服务端返回的格式依然是标准的HTTP协议格式

 

HTTP/1.1 200 OK  说明服务器成功处理请求

 

Server 是服务器的IIS,这里是VS中轻量级的web server

 

SOAP的自动化

 

SOAP是应用程序远程调用的基础,既然那么重要,可我们为什么不常见到上面说的那些消息格式呢?而经常使用的方式可能是:

 

var proxy=new TestService.AddServiceClient();
proxy.GetPerson();

 

这主要是因为开发工具或者说开发框架已经替我们做了协议识别的工作,这个过程跟WSDL密(网络服务描述语言)

 

切相关,比如我们调用一个Webservice,visualstudio就会自动根据服务端的WSDL来确定自己要生成的代理类。

 

以我本机为例,有一个服务

 

image

 

点击这个地址进去后可以发现这个服务使用WSDL来描述的情况,VS就是根据下面的描述来建立代理类的

 

image

 

然后我们在VS中添加这个服务的引用

 

image

 

然后VS会自动帮我们建立一些代理类来访问服务,我们可以在MessageService上右键,选择View in Object Browser来查看

 

代理类的生成情况

 

image

 

通过查看我们可以了解到这个服务所需的一些实体类和接口VS已经帮我们建立好了

 

image

 

总结

 

SOAP是一种很不错的跨应用程序、跨平台解决方案,利用XML的多平台性和W3C的统一标准,使各种程序能够在同

 

一个标准下进行通信