2013-08-11 3 views
38

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

+0

Как это решение? http://stackoverflow.com/q/15569330/2620328 – sihrc

+0

не предполагается использовать пены; –

+0

@ DeepankarBajpeyi почему бы и нет? Это единственный инструмент, подходящий для работы. –

ответ

74

Это действительно возможно.

Вот пример вызова погоды SOAP-службы с помощью текстовых запросов 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, вероятно, более правильно заголовок для использования (но weatherservice предпочитает text/xml
  • Это возвращает ответ в виде строки XML. - то тогда нужно будет разобрать, что XML
  • Для простоты я включил запрос . как простой текст, но лучше практика будет хранить это в качестве шаблона, то вы можете загрузить его с помощью jinja2 (к примеру) - и также проходят в переменных

Например:

.

Некоторые люди упомянули библиотеку пены. 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 

Примечание: при использовании пены, вы почти всегда будете в конечном итоге нужно use the doctor!

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

sudo tcpdump -As 0 

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

Вышеуказанные два фрагмента кода, также доступны в гов:

+1

Что делать, если служба запрашивает имя пользователя и пароль? где их отметить? – Oskars

+0

Фрагмент кода пены теперь дает «suds.transport.TransportError: Ошибка HTTP 500: Внутренняя ошибка сервера». Похоже, сервер закрыт. – Louis

+0

@ toast38coza http://wsf.cdyne.com/WeatherWS/Weather.asmx?WSDL -> Ошибка сервера в приложении «/ WeatherWS». Пожалуйста, обновите пример. –

Смежные вопросы