- 基于 SOAP (Simple Object Access Protocol) 的 WebService
- 基于 RESTful (Representational State Transfer) 的 WebService API
下面我将详细介绍这两种方式的实现方法,并提供完整的代码示例。

访问基于 SOAP 的 WebService
SOAP 是一种协议,它使用 XML 进行消息交换,访问 SOAP WebService 通常需要知道它的 WSDL (Web Services Description Language) 文件,WSDL 文件定义了服务的接口,包括可用的方法、参数和返回值类型。
Python 中处理 SOAP 最常用的库是 zeep。
安装 zeep 库
你需要安装 zeep,打开你的终端或命令行,运行:
pip install zeep
获取 WSDL 地址
提供 SOAP 服务的网站会提供一个 WSDL 文件的 URL,一个示例的 WSDL 地址可能是:http://www.example.com/webservice/service.asmx?wsdl

编写 Python 代码
以下是一个完整的示例,演示如何使用 zeep 调用一个 SOAP WebService。
假设有一个天气预报的 SOAP 服务,其 WSDL 地址为 http://www.webxml.com.cn//webservices/weatherwebservice.asmx?wsdl,这是一个公开的测试服务。
# 导入 zeep
from zeep import Client
from zeep.transports import Transport
from requests import Session
import requests
# 1. 定义 WSDL 地址
wsdl_url = 'http://www.webxml.com.cn//webservices/weatherwebservice.asmx?wsdl'
# 可选:设置超时和代理
# 创建一个 Session 对象来配置请求
session = Session()
session.timeout = 10 # 设置超时时间(秒)
# 如果需要代理,可以取消下面这行注释并替换为你的代理地址
# session.proxies = {'http': 'http://your_proxy:port', 'https': 'http://your_proxy:port'}
# 创建 Transport 对象
transport = Transport(session=session)
# 2. 创建客户端,连接到 WSDL
# 我们可以使用 transport 参数来传递自定义的传输配置
try:
client = Client(wsdl_url=wsdl_url, transport=transport)
# 打印服务的可用方法(端口类型)
print("可用的服务操作:")
print(client.wsdl.dump())
# 3. 调用服务方法
# 假设服务有一个名为 'getWeatherbyCityName' 的方法
# 参数 'theCityName' 是从 WSDL 中看到的参数名
city_name = '北京'
print(f"\n正在查询 {city_name} 的天气信息...")
# 调用方法并传入参数
result = client.service.getWeatherbyCityName(theCityName=city_name)
# 4. 处理返回结果
# 返回结果是 Python 的原生数据结构(字典、列表等)
if result and result.get('getWeatherResult'):
# getWeatherResult 是一个包含 XML 字符串的列表
weather_info_xml = result['getWeatherResult'][0]
print("\n成功获取天气信息:")
print(weather_info_xml)
# 你可以使用 zeep 的 helpers 来解析 XML
# from zeep.helpers import serialize
# parsed_data = serialize(result)
# print("\n解析后的数据:")
# print(parsed_data)
else:
print("\n获取天气信息失败,请检查城市名或服务状态。")
except requests.exceptions.RequestException as e:
print(f"网络请求错误: {e}")
except Exception as e:
print(f"发生错误: {e}")
代码解析:
Client(wsdl_url=wsdl_url):zeep的核心类,通过传入 WSDL 地址来创建客户端,它会自动解析 WSDL 文件。client.service: 连接成功后,所有在 WSDL 中定义的服务方法都会作为client.service的属性出现,你可以直接调用它们。- 参数传递: 调用方法时,参数名必须与 WSDL 中定义的参数名一致(
theCityName)。 - 返回值:
zeep会自动将返回的 XML 数据转换为 Python 的原生对象,如字典、列表、字符串等,非常方便。
访问基于 RESTful 的 WebService (API)
现代 WebService 大多采用 RESTful 风格,它更轻量级,通常使用 JSON 作为数据交换格式,并通过 HTTP 动词(GET, POST, PUT, DELETE)来操作资源。

Python 中访问 RESTful API 最常用的库是 requests。
安装 requests 库
如果你还没有安装,请运行:
pip install requests
了解 API 端点和文档
你需要知道 API 的 URL(端点)、所需的 HTTP 方法、需要传递的参数(查询参数或请求体)以及返回的 JSON 数据结构,API 提供方会提供详细的文档。
编写 Python 代码
这里我们以一个公开的 API——JSONPlaceholder(一个用于测试的免费 REST API)为例,演示如何获取一篇博客文章。
# 导入 requests 库
import requests
import json
# 1. 定义 API 端点
# 获取 ID 为 1 的文章
url = 'https://jsonplaceholder.typicode.com/posts/1'
# 2. 设置请求头 (可选)
# 告诉服务器我们希望接收 JSON 格式的响应
headers = {
'Accept': 'application/json',
'User-Agent': 'My-Python-App/1.0' # 有些 API 会要求或推荐 User-Agent
}
# 3. 发送 GET 请求
# requests.get() 会返回一个 Response 对象
try:
response = requests.get(url, headers=headers, timeout=5) # 设置5秒超时
# 4. 检查请求是否成功
# response.raise_for_status() 会在状态码不是 2xx 时抛出异常
response.raise_for_status()
# 5. 解析 JSON 数据
# response.json() 会将响应体的内容解析为 Python 字典
data = response.json()
print("成功获取数据:")
# 使用 json.dumps 美化输出 JSON
print(json.dumps(data, indent=4, ensure_ascii=False))
# 6. 访问特定的数据字段
print("\n--- 提取特定信息 ---")
print(f"文章 ID: {data['id']}")
print(f"标题: {data['title']}")
print(f"内容: {data['body']}")
except requests.exceptions.HTTPError as errh:
print(f"HTTP 错误: {errh}")
except requests.exceptions.ConnectionError as errc:
print(f"连接错误: {errc}")
except requests.exceptions.Timeout as errt:
print(f"请求超时: {errt}")
except requests.exceptions.RequestException as err:
print(f"发生未知错误: {err}")
代码解析:
requests.get(url, ...): 发送一个 HTTP GET 请求到指定的 URL。requests库还提供了post(),put(),delete()等方法。headers: 用于设置 HTTP 请求头。Accept: application/json是一个很好的实践,告诉服务器我们期望返回 JSON 数据。response.raise_for_status(): 这是一个非常方便的错误检查方法,如果响应的状态码表示错误(如 404 Not Found, 500 Internal Server Error),它会抛出HTTPError异常。response.json(): 这是requests库的精髓之一,它会自动将响应内容(Content-Type 是application/json)解析为 Python 的字典或列表,省去了手动使用json库解析的麻烦。- 异常处理: 强烈建议使用
try...except块来处理网络请求中可能发生的各种异常,如连接错误、超时、HTTP 错误等。
总结与对比
| 特性 | SOAP (使用 zeep) |
RESTful (使用 requests) |
|---|---|---|
| 协议 | 严格的协议,基于 XML | 架构风格,基于 HTTP |
| 数据格式 | XML | 通常是 JSON,也可以是 XML、HTML 等 |
| 标准 | 有 WSDL 描述服务接口 | 无统一标准,依赖 API 文档 |
| 复杂度 | 较重,协议复杂 | 轻量,简单易用 |
| 安全性 | 内置安全机制(WS-Security) | 通常依赖 HTTPS 和 OAuth 等标准 |
| 适用场景 | 企业级应用、金融、电信等对安全性和事务性要求高的场景 | Web 和移动应用、微服务、API 经济等现代场景 |
| Python 库 | zeep, suds-py3 |
requests |
如何选择?
- 如果你要访问的是一个传统的、企业级的 WebService,并且你有一个
.wsdl文件,那么你应该使用zeep。 - 如果你要访问的是一个现代的 Web API,它通常返回 JSON,并且有清晰的 API 文档,那么你应该使用
requests。
对于绝大多数新的开发需求,你遇到的都是 RESTful API,requests 是更常用和需要掌握的工具。
