2013-08-11 52 views

Trả lời

74

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ích text/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:

+1

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

+0

Đ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

+0

@ 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ụ. –

Các vấn đề liên quan