Python 上的 SOAP API

问题描述 投票:0回答:3

我正在尝试调用国家/地区首都 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 上做错了什么吗?

python soap
3个回答
4
投票

一个好的 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 来完成繁重的工作。


1
投票

这有效:-

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)

0
投票

服务 WSDLURL 地址是: 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 请求),则需要使用端点地址。

© www.soinside.com 2019 - 2024. All rights reserved.