杰瑞科技汇

Python如何访问WebService?

  1. 基于 SOAP (Simple Object Access Protocol) 的 WebService
  2. 基于 RESTful (Representational State Transfer) 的 WebService API

下面我将详细介绍这两种方式的实现方法,并提供完整的代码示例。

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

访问基于 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如何访问WebService?-图2
(图片来源网络,侵删)

编写 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}")

代码解析:

  1. Client(wsdl_url=wsdl_url): zeep 的核心类,通过传入 WSDL 地址来创建客户端,它会自动解析 WSDL 文件。
  2. client.service: 连接成功后,所有在 WSDL 中定义的服务方法都会作为 client.service 的属性出现,你可以直接调用它们。
  3. 参数传递: 调用方法时,参数名必须与 WSDL 中定义的参数名一致(theCityName)。
  4. 返回值: zeep 会自动将返回的 XML 数据转换为 Python 的原生对象,如字典、列表、字符串等,非常方便。

访问基于 RESTful 的 WebService (API)

现代 WebService 大多采用 RESTful 风格,它更轻量级,通常使用 JSON 作为数据交换格式,并通过 HTTP 动词(GET, POST, PUT, DELETE)来操作资源。

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

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}")

代码解析:

  1. requests.get(url, ...): 发送一个 HTTP GET 请求到指定的 URL。requests 库还提供了 post(), put(), delete() 等方法。
  2. headers: 用于设置 HTTP 请求头。Accept: application/json 是一个很好的实践,告诉服务器我们期望返回 JSON 数据。
  3. response.raise_for_status(): 这是一个非常方便的错误检查方法,如果响应的状态码表示错误(如 404 Not Found, 500 Internal Server Error),它会抛出 HTTPError 异常。
  4. response.json(): 这是 requests 库的精髓之一,它会自动将响应内容(Content-Type 是 application/json)解析为 Python 的字典或列表,省去了手动使用 json 库解析的麻烦。
  5. 异常处理: 强烈建议使用 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 是更常用和需要掌握的工具。

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