Gửi yêu cầu SOAP bằng Yêu cầu Python


79

Có thể sử dụng requeststhư viện của Python để gửi một yêu cầu SOAP không?


Giải pháp này như thế nào? stackoverflow.com/q/15569330/2620328
sihrc

không được sử dụng suds;
Deepankar Bajpeyi

@DeepankarBajpeyi tại sao không? Đó là công cụ duy nhất phù hợp với công việc.
Ian Stapleton Cordasco

1
Bạn có thể chuyển a requests.Sessionđến zeep .
OrangeDog

@IanStapletonCordasco thậm chí vào năm 2013 suds đã chết.
OrangeDog

Câu trả lời:


159

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 ý:

  • 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+xmlcó lẽ là tiêu đề chính xác hơn để sử dụng (nhưng weatherservice thíchtext/xml
  • Điều này sẽ trả về phản hồi dưới dạng một chuỗi xml - sau đó bạn sẽ cần phải phân tích cú pháp xml đó.
  • Để đơn giản, tôi đã bao gồm yêu cầu dưới dạng văn bản thuần túy. Nhưng thực tiễn tốt nhất là lưu trữ nó dưới dạng một mẫu, sau đó bạn có thể tải nó bằng jinja2 (ví dụ) - và cũng có thể chuyển vào các biến.

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:


2
nếu dịch vụ yêu cầu tên người dùng và mật khẩu thì sao? lưu ý chúng ở đâu?
Oskars

Đoạn mã suds hiện đưa ra "suds.transport.TransportError: HTTP Error 500: Internal Server Error". Có vẻ như máy chủ đã bị đóng.
Louis

3
@ toast38coza 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ụ.
Wlad

1
@ toast38coza Tôi lấy thông tin cho các biến tiêu đề và nội dung trong ví dụ yêu cầu ở trên ở đâu?
Wlad

Tài liệu Suds không còn có sẵn trên fedorahosted.org. Đây là liên kết đến ảnh chụp nhanh của tài liệu trên Wayback Machine.
Christian Long
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.