2013-08-11 33 views

答えて

74

確かに可能です。

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 

いくつかの注意:

  • ヘッダが重要である。ここ

    は無地の要求のlibを使用して天気のSOAPサービスを呼び出す例です。ほとんどのSOAP要求は、正しいヘッダーなしでは機能しません。 application/soap+xmlは、おそらく使用するより正しいヘッダである(しかし、weatherserviceこれは、XMLの文字列として応答を返しますtext/xml

  • を好む - 私は要求が含まれているあなたは、そのXMLを解析する必要があるだろう
  • を簡単にするために。 。プレーンテキストしかし、ベストプラクティスとして、テンプレートとして保存することであろう、そしてあなたは、(例えば)Jinja2のを使用してそれを読み込むことができます - そしてまた、変数を渡し例えば

一部の人々はsudsライブラリについて言及しています。 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 

これは、実際にワイヤ上で行くの要求を検査するための参考にすることができます。

上記の2つのコードスニペット は、要旨としても使用できます。

+1

サービスがユーザー名とパスワードを要求するとどうなりますか?どこに書き留めますか? – Oskars

+0

sudsコードのスニペットに "suds.transport.TransportError:HTTPエラー500:内部サーバーエラー"が表示されるようになりました。サーバーが閉じられているようです。 – Louis

+0

@ toast38coza http://wsf.cdyne.com/WeatherWS/Weather.asmx?WSDL - > '/ WeatherWS'アプリケーションのサーバーエラー例を更新してください。 –

関連する問題