Có thể sử dụng requests
thư viện của Python để gửi một yêu cầu SOAP không?
Có thể sử dụng requests
thư viện của Python để gửi một yêu cầu SOAP không?
Câu trả lời:
Nó thực sự là có thể.
Đây là một ví dụ gọi Dịch vụ SOAP thời tiết bằng cách sử dụng các yêu cầu đơn giản lib:
import requests
url="http://wsf.cdyne.com/WeatherWS/Weather.asmx?WSDL"
#headers = {'content-type': 'application/soap+xml'}
headers = {'content-type': 'text/xml'}
body = """<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:ns0="http://ws.cdyne.com/WeatherWS/" xmlns:ns1="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<ns1:Body><ns0:GetWeatherInformation/></ns1:Body>
</SOAP-ENV:Envelope>"""
response = requests.post(url,data=body,headers=headers)
print response.content
Một số lưu ý:
application/soap+xml
có lẽ là tiêu đề chính xác hơn để sử dụng (nhưng weatherservice thíchtext/xml
Ví dụ:
from jinja2 import Environment, PackageLoader
env = Environment(loader=PackageLoader('myapp', 'templates'))
template = env.get_template('soaprequests/WeatherSericeRequest.xml')
body = template.render()
Một số người đã đề cập đến thư viện suds. Suds có lẽ là nhiều hơn cách đúng đắn hơn để tương tác với SOAP, nhưng tôi thường thấy rằng nó hơi lo lắng khi bạn có WDSL được hình thành kém (mà, TBH, có nhiều khả năng hơn là không khi bạn đang giao dịch với một tổ chức vẫn sử dụng SOAP;)).
Bạn có thể làm như trên với các sud như sau:
from suds.client import Client
url="http://wsf.cdyne.com/WeatherWS/Weather.asmx?WSDL"
client = Client(url)
print client ## shows the details of this service
result = client.service.GetWeatherInformation()
print result
Lưu ý: khi sử dụng suds, bạn sẽ gần như luôn luôn cần sử dụng bác sĩ !
Cuối cùng, một phần thưởng nhỏ cho việc gỡ lỗi SOAP; TCPdump là bạn của bạn. Trên Mac, bạn có thể chạy TCPdump như sau:
sudo tcpdump -As 0
Điều này có thể hữu ích cho việc kiểm tra các yêu cầu thực sự đi qua dây.
Hai đoạn mã trên cũng có sẵn dưới dạng chính: