2013-08-11 31 views

cevap

74

Bu gerçekten mümkündür.

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 

bazı notlar:

  • başlıkları önemlidir

    Burada düz istekleri lib kullanarak Hava SABUN Hizmetlerini arayarak bir örnektir. Çoğu SOAP isteği doğru başlık olmadan çalışmayacaktır. application/soap+xml muhtemelen kullanmak daha doğru başlıktır (ama Hava Servisi Bu xml dize olarak yanıt dönecektir text/xml

  • tercih - Ben isteği dahil ettik ardından da söz konusu xml ayrıştırmak gerekir
  • Kolaylık olması açısından. . düz metin Ama en iyi uygulama olarak bir şablon olarak bu depolamak olacaktır, o zaman (örneğin) jinja2 kullanarak yükleyebilirsiniz - ve aynı zamanda değişkenler geçmek Örneğin

:

.

Bazı insanlar köpük kütüphanesinden bahsetmişlerdir. Suds, SOAP ile etkileşimde bulunmak için muhtemelen doğru yoludur, ancak sıklıkla kötü bir şekilde oluşturulmuş WDSL'leriniz olduğunda (ki bu TBH, bir kurumla uğraşırken değil, daha büyük olasılıkla) panik olduğunu farkediyorum. hala SOAP kullanır;)).

Öyle gibi köpüğüyle yukarıdaki yapabilirsiniz:

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 

Not: köpük kullanırken, neredeyse her zaman use the doctor ihtiyacı kadar sona erecek!

Son olarak, SOAP hata ayıklaması için küçük bir bonus; TCPdump senin arkadaşın. Mac'te, şöyle tcpdump çalıştırabilirsiniz:

sudo tcpdump -As 0 

Bu aslında telin üzerinden gitmek istekleri teftiş için yararlı olabilir.

yukarıdaki iki kod snippet'ine uz olarak da mevcuttur:

+1

Servis kullanıcı adı ve şifre isterse ne olur? onları nereye not etmek – Oskars

+0

Artık kod snippet'i "suds.transport.TransportError: HTTP Error 500: Dahili Sunucu Hatası" verir. Sunucu kapalı gibi görünüyor. – Louis

+0

@ toast38coza http://wsf.cdyne.com/WeatherWS/Weather.asmx?WSDL -> '/ WeatherWS' Uygulamasında Sunucu Hatası. Lütfen örneği güncelleyin. –

İlgili konular