Надсилання запиту SOAP за допомогою запитів Python


79

Чи можна використовувати requestsбібліотеку Python для надсилання запиту SOAP?


Як це рішення? stackoverflow.com/q/15569330/2620328
sihrc

не слід використовувати піну;
Deepankar Bajpeyi

@DeepankarBajpeyi чому ні? Це єдиний інструмент, придатний для роботи.
Ian Stapleton Cordasco

1
Ви можете передати requests.Sessionв zeep .
OrangeDog

@IanStapletonCordasco навіть у 2013 році піна була мертва.
OrangeDog

Відповіді:


161

Це справді можливо.

Ось приклад виклику служби SOAP Weather за допомогою простих 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

Деякі примітки:

  • Заголовки важливі. Більшість запитів SOAP не працюватимуть без правильних заголовків. application/soap+xmlє, мабуть, найбільш правильним заголовком для використання (але служба погоди надає перевагуtext/xml
  • Це поверне відповідь у вигляді рядка xml - тоді вам потрібно буде проаналізувати цей xml.
  • Для простоти я включив запит як звичайний текст. Але найкращою практикою було б зберегти це як шаблон, тоді ви можете завантажити його за допомогою jinja2 (наприклад) - а також передати змінні.

Наприклад:

from jinja2 import Environment, PackageLoader
env = Environment(loader=PackageLoader('myapp', 'templates'))
template = env.get_template('soaprequests/WeatherSericeRequest.xml')
body = template.render()

Деякі люди згадували бібліотеку піни. Suds - це, мабуть, найбільш правильний спосіб взаємодії з SOAP, але я часто виявляю, що це трохи панікує, коли у вас WDSL-файли погано сформовані (що, TBH, швидше за все, коли ви маєте справу з установою, яка все ще використовує SOAP;)).

Ви можете зробити вищезазначене з піною так:

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 

Примітка: використовуючи піну, майже завжди вам доведеться звернутися до лікаря !

Нарешті, невеликий бонус за налагодження SOAP; TCPdump - ваш друг. На Mac ви можете запустити TCPdump так:

sudo tcpdump -As 0 

Це може бути корисним для перевірки запитів, які насправді надходять.

Наведені вище два фрагменти коду також доступні у вигляді таблиць:


2
що робити, якщо служба запитує ім’я користувача та пароль? де їх відзначити?
Оскарс

Фрагмент коду піни тепер видає "suds.transport.TransportError: Помилка HTTP 500: Внутрішня помилка сервера". Здається, сервер закритий.
Луї

3
@ toast38coza wsf.cdyne.com/WeatherWS/Weather.asmx?WSDL -> Помилка сервера в додатку '/ WeatherWS'. Будь ласка, оновіть приклад.
Wlad

1
@ toast38coza Де я можу отримати інформацію про заголовки та змінні тіла у наведеному вище прикладі запитів?
Wlad

Документація Suds більше недоступна на fedorahosted.org. Ось посилання на знімок документації на Wayback Machine.
Крістіан Лонг
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.