我正在尝试调用国家/地区首都 SOAP API 以在 Python 上获取国家/地区首都。
import requests
url = "http://webservices.oorsprong.org/websamples.countryinfo/CountryInfoService.wso?WSDL"
headers = {'content-type': 'text/xml'}
body = """<soapenv:Envelope xmlns:soapenv=http://schemas.xmlsoap.org/soap/envelope/ xmlns:web=http://www.oorsprong.org/websamples.countryinfo>
<soapenv:Header/>
<soapenv:Body>
<web:CapitalCity>
<web:sCountryISOCode>USA</web:sCountryISOCode>
</web:CapitalCity>
</soapenv:Body>
</soapenv:Envelope>"""
response = requests.post(url,data=body,headers=headers)
print(response.content)
我收到 200 OK 响应,但它不会返回实际的国家/地区首都,而是仅在您访问此时返回浏览器中的全部内容 http://webservices.oorsprong.org/websamples.countryinfo/CountryInfoService.wso ?WSDL
它在 SoapUI 上运行没有问题,你知道我在 python 上做错了什么吗?
一个好的 SOAP 客户端应该为您构建 XML。 SOAP 是一种传输,就像十几个其他远程过程调用系统中的任何一个一样。 zeep 是一种 SOAP 客户端。它读取 WSDL 并构建一个本地客户端供您调用。您可以通过以下方式完成工作
import zeep
url = "http://webservices.oorsprong.org/websamples.countryinfo/CountryInfoService.wso?WSDL"
client = zeep.Client(url)
print(client.service.CapitalCity("USA"))
让 zeep 来完成繁重的工作。
这有效:-
import requests
xml = """<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Body>
<CapitalCity xmlns="http://www.oorsprong.org/websamples.countryinfo">
<sCountryISOCode>USA</sCountryISOCode>
</CapitalCity>
</soap12:Body>
</soap12:Envelope>"""
url = 'http://webservices.oorsprong.org/websamples.countryinfo/CountryInfoService.wso'
headers = {'Content-Type': 'application/soap+xml; charset=utf-8'}
with requests.Session() as session:
r = session.post(url, headers=headers, data=xml)
r.raise_for_status()
print(r.text)
服务 WSDL的 URL 地址是: http://webservices.oorsprong.org/websamples.countryinfo/CountryInfoService.wso?WSDL 这就是您获得 WSDL 内容而不是响应消息的原因。
服务端点的 URL 地址在 WSDL 中指定,为: http://webservices.oorsprong.org/websamples.countryinfo/CountryInfoService.wso
如果您使用像 zeep 这样的 SOAP 库,您可以使用 WSDL URL 初始化客户端,但是如果您自己使用 SOAP 服务(发出 HTTP POST 请求),则需要使用端点地址。