如何在Python的SOAP请求中添加SOAPAction参数
解决方法
正确添加SOAPAction的方式
SOAPAction属于标准HTTP请求头字段,添加不生效大概率是两个原因:一是头字段名拼写/格式错误,二是部分SOAP服务端要求SOAPAction的值必须用双引号包裹,否则会校验不通过。
另外当前代码还存在一个服务地址不匹配的隐藏问题:你请求的URL是EmployeeService.asmx,但调用的方法属于CompanyService,如果不是笔误的话也会导致请求失败。
修改后的完整代码
import requests # 注意:如果调用的是CompanyService的方法,建议把URL路径改成对应服务 # url = "https://api.nmbrs.nl/soap/v3/CompanyService.asmx" url = "https://api.nmbrs.nl/soap/v3/EmployeeService.asmx" # 1. 直接把SOAPAction加到headers字典里,值用双引号包裹 headers = { 'content-type': 'text/xml; charset=utf-8', 'SOAPAction': '"https://api.nmbrs.nl/soap/v3/CompanyService/List_GetAll"' } body = """<?xml version="1.0" encoding="utf-8"?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:com="https://api.nmbrs.nl/soap/v3/CompanyService"> <soapenv:Header> <com:AuthHeaderWithDomain> <!--Optional:--> <com:Username>{}</com:Username> <!--Optional:--> <com:Token>{}</com:Token> <!--Optional:--> <com:Domain>{}</com:Domain> </com:AuthHeaderWithDomain> </soapenv:Header> <soapenv:Body> <com:List_GetAll/> </soapenv:Body> </soapenv:Envelope>""".format(username, token, domain) response = requests.post(url, data=body, headers=headers) # 调试用:可以打印请求头和返回内容确认问题 # print(response.request.headers) # print(response.status_code, response.text)
校验排查方法
- 执行后打印
response.request.headers确认SOAPAction头已经被正确携带 - 如果还是报错,打印
response.text查看服务端返回的具体错误提示,确认是SOAPAction校验问题、权限问题还是服务地址/方法不匹配问题
内容的提问来源于stack exchange,提问作者WibeMan
相关产品推荐
相关产品推荐

