使用Python Zeep调用WebService遇415错误,如何查看SOAP请求内容?
解决Zeep调用WebService的415错误并查看SOAP请求内容
这个415 Unsupported Media Type错误大概率是请求的Content-Type不符合服务端要求,或者SOAP信封的格式有问题。要排查这个问题,你可以通过以下几种方式查看实际发送的SOAP请求细节:
1. 改进自定义Logging Plugin打印请求内容
你已经写了MyLoggingPlugin,可以直接在egress方法里添加打印逻辑,把HTTP头和SOAP信封内容输出出来:
class MyLoggingPlugin(Plugin): def ingress(self, envelope, http_headers, operation): return envelope, http_headers def egress(self, envelope, http_headers, operation, binding_options): http_headers['Content-Type'] = 'text/xml; charset=utf-8' # 去掉末尾多余的分号试试 # 打印HTTP请求头 print("=== 发送的HTTP请求头 ===") for key, value in http_headers.items(): print(f"{key}: {value}") # 打印SOAP请求体(转成字符串方便阅读) print("\n=== 发送的SOAP请求体 ===") print(envelope.decode('utf-8')) return envelope, http_headers
注意:envelope是bytes类型,需要用decode('utf-8')转成字符串才能正常显示XML内容。另外你原来的Content-Type末尾多了个分号,有些严格的服务器可能会识别异常,建议去掉。
2. 开启Zeep内置的DEBUG日志
Zeep本身提供了详细的日志输出,只需要配置日志级别为DEBUG就能看到完整的请求和响应细节:
import logging # 全局配置日志级别 logging.basicConfig(level=logging.DEBUG) # 单独设置Zeep的日志级别为DEBUG zeep_logger = logging.getLogger('zeep') zeep_logger.setLevel(logging.DEBUG)
运行代码后,控制台会输出包括请求URL、HTTP方法、所有请求头、SOAP请求体,以及服务端返回的响应内容,非常适合排查问题。
3. 给Requests Session添加请求钩子
因为Zeep底层使用Requests库发送HTTP请求,你可以给Session添加一个请求钩子,捕获每一个发送的请求:
def log_request_details(request): print("\n=== 请求详情 ===") print(f"URL: {request.url}") print(f"方法: {request.method}") print("请求头:") for key, value in request.headers.items(): print(f" {key}: {value}") if request.body: print("\n请求体:") print(request.body.decode('utf-8')) return request # 给session添加请求钩子 session.hooks['request'].append(log_request_details)
把这段代码放在创建session对象之后,每次Zeep发送请求时都会自动触发这个钩子,打印出完整的请求信息。
通过以上方法,你就能清楚看到实际发送给服务端的内容,对比SOAP UI里的请求,就能很快找出哪里不一致导致的415错误了。
内容的提问来源于stack exchange,提问作者user1176591
相关产品推荐
相关产品推荐

