第12章 Web Services
Web Services技术已经不在流行,但并未完全不再使用。本章内的REST也属于Web Services范围内。
12.1 Web Services相关概念
- SOA
全称是Service-Oriented Architecture,中文意思是面向服务框架,又称为“面向服务的体系结构”。
SOA的提出是在企业计算领域,就是要将紧耦合的系统,划分为面向业务的,粗粒度、松耦合、无状态的服务。服务发布出来供其他服务调用,一组互相依赖的服务就构成了SOA架构下的系统。
SOA的特性: 一种粗粒度、松耦合的服务架构,服务之间通过简单、精确定义接口进行通信,不涉及底层编程接口和通信模型。
- SOA与Web Services
现在几乎所有的SOA应用场合都是和Web Services绑定的,所以有时候这两个概念不免混用。不可否则Web Services是限制最适合实现SOA的技术,SOA的走红很大程度上归功于Web Services标准的成熟和应用普及。因为现在大家基本上认同Web Services技术在几方面体现了SOA的需要。
- Web Services
HTTP是互联网上应用最为广泛的一种网络传输协议,而Web Services是一种部署在Web上的对象或者是应用程序组件,Web Services数据的传输同样需要借助HTTP协议。
Web Services是一个平台独立的、低耦合的、自包含的、基于可编程的Web应用程序,可使用开放的XML标准来描述、发布、发现、协调和配置这些应用程序,用于开发分布式的、互操作的应用程序。
- SOAP
Simple Object Access Protocol,即简单对象访问协议。
SOAP是基于XML在分散或分布式的环境中交换信息的简单的协议,允许服务提供者和服务客户经过防火墙在互联网上进行通信。
SOAP消息可以在多种消息传输模式中使用,包括超文本传输协议(HTTP)、简单邮件传输协议(SMTP)以及多用途网际邮件扩充协议(MIME),还支持消息系统、远程过程调用协议(RPC)等应用程序。大部分情况还是绑定在HTTP协议上面传输。
- WSDL
Web Services Description Language,网络服务描述语言,它是一门基于XML的语言,用于描述Web Services以及如何对它们进行访问。
WSDL文档主要使用以下几个元素来描述某个Web Services:
<portType> Web Services执行的操作
<message> Web Services使用的消息
<types> Web Services使用的数据类型
<binding> Web Services使用的通信协议
- UDDI
Universal Description Discovery and Integration,通用描述、发现与集成服务。
UDDI是一个独立于平台的框架,通过使用Internet来描述服务,发现企业,并对企业服务进行集成。
UDDI是一种用于存储有关Web Services的信息的目录:
UDDI是一种由WSDL描述的Web Services界面的目录
UDDI经由SOAP进行通信
UDDI被构建如了微软的.NET平台
综上所述,SOAP、WSDL、UDDI构成了Web Services的三要素。
12.2 Web Services的开发与调试
Python并不擅长开发Web Services接口,但是各种库都有,所以也能用。
12.2.1 suds-jurko调用接口
Suds是Web Services客户端中一个轻量级的基于SOAP的Python客户端。
Suds-jurko基于Suds,支持Python3。
wexml.com.cn网站提供了一些已经发布的Web Services接口,可以直接调用。
eg:soap_client.py
#! /usr/bin/python
# -*- coding:utf-8 -*-
from suds.client import Client
# 使用库suds_jurko:https://bitbucket.org/jurko/suds
# Web Services查询:http://www.webxml.com.cn/zh_cn/web_services.aspx
# 电话号码归属地查询
url = 'http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl'
client = Client(url)
print client
该接口提供getMobileCodeInfo()方法来查询手机号码归属地,方法接收两个参数:mobileCode(手机号)、userID(注册网站之后随机分配的用户ID)。
继续完善该脚本:
#! /usr/bin/python
# -*- coding:utf-8 -*-
from suds.client import Client
# 使用库suds_jurko:https://bitbucket.org/jurko/suds
# Web Services查询:http://www.webxml.com.cn/zh_cn/web_services.aspx
# 电话号码归属地查询
url = 'http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl'
client = Client(url)
result = client.service.getMobileCodeInfo('13012341234')
print result
运行后就能得到查询结果:
>python3 soap_client.py
13012341234: 北京 北京 北京联通GSM卡
再来一个查询天气的接口:soap_client2.py
#! /usr/bin/python
# -*- coding:utf-8 -*-
from suds.client import Client
from suds.xsd.doctor import ImportDoctor, Import
# 使用库suds_jurko:https://bitbucket.org/jurko/suds
# Web Services查询:http://www.webxml.com.cn/zh_cn/web_services.aspx
url = 'http://ws.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl'
imp = Import('http://www.w3.org/2001/XMLSchema',
location='http://www.w3.org/2001/XMLSchema.xsd')
imp.filter.add('http://Webxml.com.cn/')
client = Client(url, plugins=[ImportDoctor(imp)])
result = client.service.getWeatherbyCityName("北京")
print result
运行后,就可以得到一个北京的详细的天气预报结果。
12.2.2 spyne开发接口
soaplib是一个简单的、易于扩展的SOAP库,是用于创建和发布SOAP Web Services的专业工具。
spyne是一个传输与体系结构无关的RPC库,专注于公开服务并且具有良好定义的APIS,它是到目前还在维护的Web Services应用开发库,它的使用方法和soaplib一样简单,并且支持Python3。
12.3 JMeter测试SOAP接口
这个JMeter的存在版本差异,实在是找不到对应配置,这里直接忽略,跨过去好了。
总结
本章主要是讲解Web Services,看大家是否适用吧,如果适用就增加一些了解,不适用就忽略。