- 调用 SOAP WebService:这是比较传统和标准的 WebService 形式,通常使用 WSDL (Web Services Description Language) 文件来定义服务接口。
- 调用 RESTful WebService (API):这是目前更主流的方式,本质上是调用 HTTP 接口,返回 JSON 或 XML 格式的数据。
Part 1: 调用 SOAP WebService
SOAP WebService 的核心是 WSDL 文件,它描述了服务的地址、可用的方法、参数和返回值的结构,Python 中最常用的库是 zeep。

(图片来源网络,侵删)
准备工作:安装 zeep
pip install zeep
调用步骤:
- 获取 WSDL 地址:这是服务的“说明书”。
- 创建
zeep.Client客户端:将 WSDL 地址传入,zeep会自动解析并生成客户端对象。 - 查看服务和方法:通过客户端的
service属性,可以查看所有可用的服务及其方法。 - 调用方法:像调用普通 Python 函数一样,调用服务的方法并传入参数。
示例:调用一个公共的天气查询 SOAP 服务
这里我们使用一个公共的测试 WSDL 地址来演示:http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl
分析 WSDL
这个服务提供 getWeatherbyCityName 方法,需要一个 cityName 参数,返回一个包含天气信息的数组。
Python 代码实现

(图片来源网络,侵删)
from zeep import Client
# 1. WSDL 文件的地址
wsdl_url = 'http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl'
try:
# 2. 创建 zeep 客户端
# wsdl=wsdl_url 指定 WSDL 地址
# ps='http://WebXml.com/' 是这个服务的命名空间,zeep 有时会自动处理,但有时需要显式指定
client = Client(wsdl=wsdl_url)
# 3. 查看服务端点地址和可用方法
print("服务端点地址:", client.service._binding_options['address'])
print("可用方法:", client.service) # 打印所有可用的服务方法
# 4. 调用服务方法
city_name = "北京"
print(f"\n正在查询 {city_name} 的天气信息...")
# 调用 getWeatherbyCityName 方法
# 返回的是一个列表,第一个元素通常是返回码和说明,后面是具体数据
result = client.service.getWeatherbyCityName(cityName=city_name)
# 5. 处理返回结果
if result and len(result) > 1:
# 第一个元素是返回状态
status = result[0]
print(f"查询状态: {status}")
# 后面的元素是具体的天气数据
# 具体含义需要参考 WSDL 文档或返回数据的说明
weather_data = result[1]
print("\n--- 天气详情 ---")
print(f"城市: {weather_data[1]}")
print(f"日期: {weather_data[2]}")
print(f"时间: {weather_data[3]}")
print(f"当前温度: {weather_data[4]}")
print(f"今日天气: {weather_data[5]}")
print(f"今日穿衣指数: {weather_data[15]}")
else:
print("查询失败,未获取到数据。")
except Exception as e:
print(f"调用 WebService 出错: {e}")
代码解释:
Client(wsdl=wsdl_url):zeep会下载并解析 WSDL 文件,为你准备好所有的一切。client.service:这是访问所有已定义服务的入口点。client.service.getWeatherbyCityName(cityName=city_name):直接调用方法,参数名需要与 WSDL 中定义的保持一致(这里是cityName)。- 返回结果处理:SOAP 的返回结构可能很复杂,通常是嵌套的字典或列表,上面的例子中,返回的是一个列表,你需要根据 WSDL 的说明或打印结果来解析数据。
zeep会自动将 XML 响应转换成 Python 的原生数据类型(如str,int,list,dict)。
Part 2: 调用 RESTful WebService (API)
RESTful WebService 遵循 REST 架构风格,本质上是 HTTP 请求,它不依赖 WSDL,而是通过 URL 来定位资源,通过 HTTP 方法(GET, POST, PUT, DELETE)来操作资源,通常返回 JSON 格式的数据。
Python 中最常用的库是 requests。
准备工作:安装 requests
pip install requests
调用步骤:
- 获取 API 文档:这是最重要的,文档会告诉你 URL、请求方法、需要的参数(Query Parameters 或 Request Body)、请求头(Headers,如认证信息)以及返回的 JSON 结构。
- 构造请求:使用
requests库的get(),post(),put(),delete()等方法发送 HTTP 请求。 - 处理响应:检查响应状态码(
response.status_code),如果成功(通常是 200),则解析 JSON 数据(response.json())。
示例:调用一个公共的 JSONPlaceholder 测试 API
JSONPlaceholder 是一个免费的在线 REST API 测试服务,非常适合学习,我们用它来获取一个用户的信息。

(图片来源网络,侵删)
分析 API 文档
- URL:
https://jsonplaceholder.typicode.com/users/1 - 方法:
GET - 描述: 获取 ID 为 1 的用户信息。
- 返回: 一个 JSON 对象,包含用户的详细信息。
Python 代码实现
import requests
import json
# 1. API 的 URL
api_url = 'https://jsonplaceholder.typicode.com/users/1'
try:
# 2. 发送 GET 请求
# timeout=10 设置超时时间为10秒
response = requests.get(api_url, timeout=10)
# 3. 检查请求是否成功
# HTTP 状态码 200 表示成功
if response.status_code == 200:
# 4. 解析 JSON 响应内容
# response.json() 会将 JSON 字符串自动转换为 Python 字典
user_data = response.json()
print("请求成功!")
print("\n--- 用户信息 ---")
# 格式化输出 JSON,indent=4 使其更易读
# print(json.dumps(user_data, indent=4, ensure_ascii=False))
# 直接从字典中获取数据
print(f"用户 ID: {user_data['id']}")
print(f"用户名: {user_data['username']}")
print(f"邮箱: {user_data['email']}")
print(f"城市: {user_data['address']['city']}")
else:
print(f"请求失败,状态码: {response.status_code}")
print(f"响应内容: {response.text}")
except requests.exceptions.RequestException as e:
print(f"请求 API 出错: {e}")
代码解释:
requests.get(api_url):发送一个 GET 请求到指定的 URL。response.status_code:获取 HTTP 响应状态码,用于判断请求是否成功。response.json():这是requests库非常方便的一个功能,它会自动将响应体中的 JSON 字符串解析成 Python 的字典或列表。response.text:如果响应不是 JSON,或者你想直接看到原始文本,可以使用这个属性。- 错误处理:使用
try...except捕获网络连接超时、域名解析失败等异常,使程序更健壮。
总结与对比
| 特性 | SOAP WebService | RESTful WebService (API) |
|---|---|---|
| 协议 | 基于 HTTP/SMTP 等协议,但有自己的规范(SOAP 信封)。 | 基于标准的 HTTP 协议。 |
| 数据格式 | 主要是 XML。 | 主要是 JSON,也支持 XML、纯文本等。 |
| 核心标准 | WSDL (服务描述), UDDI (发现服务)。 | 无统一标准,依赖 API 文档 (如 OpenAPI/Swagger)。 |
| 方法 | 定义了标准的操作 (如 getWeatherbyCityName)。 |
使用 HTTP 方法 (GET, POST, PUT, DELETE)。 |
| 学习/使用难度 | 较高,需要理解 SOAP 和 WSDL。 | 较低,就是发送 HTTP 请求。 |
| Python 库 | zeep, suds-py3 |
requests (最主流), httpx (支持异步) |
| 适用场景 | 企业级应用集成、金融、电信等对安全性和事务性要求高的场景。 | Web 前后端分离、移动端后端、第三方服务集成等绝大多数现代场景。 |
如何选择?
- 如果你需要对接的是一个传统的、企业内部的 WebService,并且你拿到了它的 WSDL 文件,那么你应该使用
zeep。 - 如果你对接的是一个现代的 Web 服务,它的文档告诉你这是一个 RESTful API,返回的是 JSON 数据,那么你应该使用
requests,目前绝大多数新项目都属于这一类。
希望这个详细的指南能帮助你!
