Có thể sử dụng thư viện requests
của Python để gửi yêu cầu SOAP không?Gửi yêu cầu SOAP bằng cách sử dụng Yêu cầu Python
Trả lời
Thực sự là có thể.
Dưới đây là một ví dụ gọi SOAP Weather Service sử dụng đơn giản yêu cầu 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 ý:
- Các tiêu đề rất quan trọng. Hầu hết các yêu cầu SOAP sẽ không hoạt động nếu không có tiêu đề chính xác.
application/soap+xml
có lẽ là hơn đúng tiêu đề để sử dụng (nhưng weatherservice thíchtext/xml
- này sẽ trả lại phản ứng như là một chuỗi của xml -. Sau đó bạn sẽ cần phải phân tích xml mà
- Để đơn giản tôi đã bao gồm các yêu cầu . plain text Nhưng thực hành tốt nhất sẽ được lưu trữ này làm mẫu, sau đó bạn có thể tải nó bằng cách sử jinja2 (ví dụ) - và cũng vượt qua trong các biến
Ví dụ:
.Một số người đã đề cập đến thư viện thư viện. Suds có lẽ là cách chính xác hơn tương tác với SOAP, nhưng tôi thường thấy rằng nó hoảng loạn một chút khi bạn có WDSL được hình thành không đúng (TBH, có nhiều khả năng không phải khi bạn đang giao dịch với một tổ chức vẫn còn sử dụng SOAP;)).
Bạn có thể làm các việc trên với bọt như vậy:
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 bọt, bạn sẽ hầu như luôn luôn kết thúc cần phải use the doctor!
Cuối cùng, một chút tiền thưởng để gỡ lỗi SOAP; TCPdump là bạn của bạn. Trên máy Mac, bạn có thể chạy TCPdump như sau:
sudo tcpdump -As 0
Điều này có thể hữu ích để 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 như là GIST:
nếu dịch vụ yêu cầu tên người dùng và mật khẩu thì sao? nơi để lưu ý chúng? – Oskars
Đoạn mã suds hiện cung cấp "suds.transport.TransportError: Lỗi HTTP 500: Lỗi máy chủ nội bộ". Có vẻ như máy chủ đã bị đóng. – Louis
@ toast38coza http://wsf.cdyne.com/WeatherWS/Weather.asmx?WSDL -> Lỗi máy chủ trong ứng dụng '/ WeatherWS'. Vui lòng cập nhật ví dụ. –
thế nào là giải pháp này? http://stackoverflow.com/q/15569330/2620328 – sihrc
không được phép sử dụng bọt; –
@DeepankarBajpeyi tại sao không? Đó là công cụ duy nhất phù hợp cho công việc. –