杰瑞科技汇

Python如何调用WebService?

  1. 调用 SOAP WebService:这是比较传统和标准的 WebService 形式,通常使用 WSDL (Web Services Description Language) 文件来定义服务接口。
  2. 调用 RESTful WebService (API):这是目前更主流的方式,本质上是调用 HTTP 接口,返回 JSON 或 XML 格式的数据。

Part 1: 调用 SOAP WebService

SOAP WebService 的核心是 WSDL 文件,它描述了服务的地址、可用的方法、参数和返回值的结构,Python 中最常用的库是 zeep

Python如何调用WebService?-图1
(图片来源网络,侵删)

准备工作:安装 zeep

pip install zeep

调用步骤:

  1. 获取 WSDL 地址:这是服务的“说明书”。
  2. 创建 zeep.Client 客户端:将 WSDL 地址传入,zeep 会自动解析并生成客户端对象。
  3. 查看服务和方法:通过客户端的 service 属性,可以查看所有可用的服务及其方法。
  4. 调用方法:像调用普通 Python 函数一样,调用服务的方法并传入参数。

示例:调用一个公共的天气查询 SOAP 服务

这里我们使用一个公共的测试 WSDL 地址来演示:http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl

分析 WSDL

这个服务提供 getWeatherbyCityName 方法,需要一个 cityName 参数,返回一个包含天气信息的数组。

Python 代码实现

Python如何调用WebService?-图2
(图片来源网络,侵删)
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

调用步骤:

  1. 获取 API 文档:这是最重要的,文档会告诉你 URL、请求方法、需要的参数(Query Parameters 或 Request Body)、请求头(Headers,如认证信息)以及返回的 JSON 结构。
  2. 构造请求:使用 requests 库的 get(), post(), put(), delete() 等方法发送 HTTP 请求。
  3. 处理响应:检查响应状态码(response.status_code),如果成功(通常是 200),则解析 JSON 数据(response.json())。

示例:调用一个公共的 JSONPlaceholder 测试 API

JSONPlaceholder 是一个免费的在线 REST API 测试服务,非常适合学习,我们用它来获取一个用户的信息。

Python如何调用WebService?-图3
(图片来源网络,侵删)

分析 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,目前绝大多数新项目都属于这一类。

希望这个详细的指南能帮助你!

分享:
扫描分享到社交APP
上一篇
下一篇